Vielen dank, ich werde mal schauen ob ich das jetzt hinbekomme. Was mich wundert ist, dass ich ja eigentlich nur das Beispielprogramm in C umgeschrieben habe, in Bascom hat es ja anscheinend so funktioniert...
Ups, sorry, mit PCINT0 verwechselt.zu 1): Der Pin INT0 ist an Port B
Klar, du musst im Interrupt doch nur nachschauen, ob der Pin gerade 0 oder 1 ist. Bei 1 war es eine steigende Flanke, bei 0 eine fallende. Dann kannst du dir auch gleich die Variable reading sparen.Oder geht das auch per Software, die Flanke zu erkennen??
PS: rc_value muss nicht static sein.
MfG
Stefan
Vielen dank, ich werde mal schauen ob ich das jetzt hinbekomme. Was mich wundert ist, dass ich ja eigentlich nur das Beispielprogramm in C umgeschrieben habe, in Bascom hat es ja anscheinend so funktioniert...
Ok, der Code sieht jetzt wie folgt aus:
Dennoch tut sich nach wie vor nichts. Die Schaltung ist komplett durchgecheckt, wenn ich PA2 manuell mit einem Testprogramm schalte, leuchtet die LED.Code:ISR(INT0_vect) { static int reading; int rc_value; if(reading == 0) { TCNT0 = 0; MCUCR = (0<<ISC00) | (1<<ISC01); reading = 1; } else { rc_value = TCNT0; TCNT0 = 0; MCUCR = (1<<ISC00) | (1<<ISC01); reading = 0; } if(rc_value > 200) { PORTA = (1<<PA2); } else { PORTA = (0<<PA2); } }
Irgendwie hängt es immer noch an der Signalabfrage... Noch eine Idee?
Hallo,
schau dir mal das Register GIMSK an. Ich kann das in deinem Programm nicht finden.
Gruß
Jens
Hi,
reicht es nicht im Hauptprogramm mit sei() alle Interrupts zu aktivieren? Hatte jetzt nur noch die ISR gepostet, main war ja soweit anscheinend in Ordnung (siehe weiter oben).
Hallo,
wenn das so währe, müssten dann nach sei() ja wirklich alle Interrupts aktiv sein. Auch die, die du nicht benutzt. Ohne ISR würde das unweigerlich zum Reset führen. Du musst schon jeden Interrupt mit seinem Register freischalten (hier in GIMSK) und du musst die Interrupts global erlauben (sei()).
Gruß
Jens
Ohhhh, du hast Recht. Hab bisher nur wenig mit Interrupts gearbeitet....
Also erst Bit setzen bzw Interrupt aktivieren und dann noch freigeben... Danke!
Und: ES GEHT!!!! Vielen vielen Dank an alle!
Einziges Problem jetzt: Die Led am Ausgang PA2 flackert ziemlich, auch wenn ich die Senderantenne ausfahre... Liegt das Flackern jetzt an meiner "Reagiergrenze" der Timer-if-Abfrage zum Schalten des Ausgangs? Eigentlich habe ich ja nur eine ja/nein-Abfrage drin, sodass es eigentlich nicht flackern sollte?
Wäre genial wenn ich das jetzt noch in den Griff bekomme!!![]()
Ok, es liegt teilweise daran, dass ich zeitgleich noch andere Aktionen mache, z.b. blinkende LEDs und dass ich dort dann mit _delay_ms Verzögerungen habe, die das Programm dann wartet und wo der Interrupt anscheinend nicht springen kann? Geht ja eigentlich nur nach jeder einzelnen Anweisung. Vielleicht sollte ich die Verzögerungen auf mehrere kürzere Verzögerungen verteilen?
EDIT: Oder vielleicht einfach einen großen Elko, der kurze Aus-Zeiten abfängt? Bei LEDs vielleicht noch möglich, wenn man jetzt aber größere Verbraucher schalten will, bringts das nicht wirklich denke ich...
EDIT2: Beides zeigt keine Wirkung. Weder Verzögerungen auf mehrere Anweisungen verteilen (wird intern wahrscheinlich eh anders abgehandelt durch den Compiler) und Elko mir 330µF (der größte den ich gerade zur Hand habe).
EDIT3: Anscheinend wird auch die ganze Schaltung über den Impuls-Pin des Empfängers mit Strom versorgt, das ist natürlich nicht so erwünscht, wozu habe ich auch den extra Spannungsregler etc. Möchte den Empfänger auch nicht so belasten.. Müsste man irgendwie trennen, vielleicht beeinflusst das alles ungünstig...
Die gesamte Schaltung zieht im Moment 120mA, die Spannungseinbrüche sind mir schleierhaft. Liegt vermutlich wirklich am Code, dass die LEDs flackern...
Hallo,
delays werden durch Interrupts unterbrochen. Im Normalfall werden nur die ISR nicht von Interruptsunterbrochen.
Solange du Spannungseinbrüche hast, brauchst du dir um den Code keine Gedanken zu machen. Was passiert, wenn du mit einem Testprogramm die Led im Sekundentakt blinken läst. Funktioniert das mit der aufgebauten Hardware?
Gruß
Jens
Hi,
Blinken im Sekundentakt geht, allerdings komischerweise nur dann, wenn ich den Sensorpin des Empfängers nicht mit der Schaltung verbinde!? Sobald ich das Empfängersignal in die Schaltung einleite, blitzt die Led nur kurz und auch nicht immer gleich hell.
Wie kann das sein??
Mein Testcode sollte doch eigentlich laufen, unabhängig von der ISR?
2 blinkende LEDs an PA1 und PA0...Code:while(1) { PORTA = (1<<PA1) | (1<<PA0); _delay_ms(1000); PORTA = (0<<PA1) | (0<<PA0); _delay_ms(1000); }
Lesezeichen