Hallo zusammen,
ich versuche über PortD Pin 2 und 3 ein externes Interrupt
herbeizufüheren (4,7KOhm Pull-Down). Leider hab ich noch nie was mit
Interrupts gemacht, und kriegs auch irgentwie nicht hin. Mein Versuch:
1
//External Interrupt Request 0
2
#define INT0_vect _VECTOR(1)
3
#define SIG_INTERRUPT0 _VECTOR(1)
4
5
ISR(INT0_vect)// veraltet: SIGNAL(SIG_INTERRUPT0)
6
{
7
//Ausgabe "Test an LCD"
8
}
Ist dies die richtige Vorgehensweise? Ich bitte um Hilfe.
MfG Ronald
>> Ist dies die richtige Vorgehensweise? Ich bitte um Hilfe.
Nein.
Du definierst die Vektoren nicht selbst, sondern überlässt das dem
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
diese #include machen dann schon die richtigen #define für deinen
Prozessor, so dass du
1
ISR(INT0_vect)
2
{
3
// mach was
4
}
machen kannst.
Eine Ausgabe auf ein LCD sollte allerdings ausser für schnelle
testzwecke tabu sein. Das dauert einfach zu lange und steht der
Forderung, dass eine ISR möglichst schnell abgearbeitet werden soll im
Wege.
Anbei der Code. Gleichzeitig muss ich anmerken, dass ich noch nicht so
erfahren bin. Das Display hängt an Port B, der Temperaturfühler an Port
C. Port D ist also frei (bis auf den externen Interrupt).
Nachdem ich deinen Quelltext gesehen habe, ist mir aufgefallen das du
den INT0 garnicht aktiviert hast; also sind GICR und MCUCR deine
Freunde.
Und im übrigen ist der Rückgabewert von main ein int...
Also, erstmal danke für die Hilfe! Ich habs geschafft mittels Interrupt
etwas am Display auszugeben. Nun versuche ich zu einer Zahl
(Temperatur_Soll) mittels Interrupt 0.5 zu addieren. Leider bekomme ich
einige Errors. Stimmt es, dass ich mit volatile eine Variabel global
deffinieren kann?
Wie willst du den auf einen Int 0.5 addieren? Ints sind immer nur
Ganzzahlen.
Du bräuchtest also eigentlich float oder double. Allerdings würde ich
dir zu Festkommaarithmetik raten.
Ciao,
VA
Nein, volatile sorgt nur dafür das der Compiler an der Variablen nichts
rumoptimiert.
Du definierst eine globale Variable indem du sie ausserhalb einer
Funktion definierst, wie du es auch fast richtig gemacht hast, nur die
10 dahinter ist Murks. Wenn du ihr einen Startwert geben wolltest, muss
noch ein = dazwischen.
Temperatur_Soll = Temperatur_Soll + 0.5 funktioniert nicht, da 0.5 keine
Ganze Zahl ist, Temperatur_Soll jedoch schon.
Und statt:
1
//Interrupt wird ausgelöst bei fallender oder steigender Flanke (INT0,INT1)
2
GIMSK=(1<<DDB6)|(1<<DDB7);
3
4
//Interrupts INT0, INT1 reagieren auf steigende Flanken
5
MCUCR=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3);
schreibst du besser:
1
//(INT0,INT1) Interrupt kann ausgelöst werden
2
GIMSK|=(1<<INT1)|(1<<INT0);
3
4
//Interrupts INT0, INT1 reagieren auf steigende Flanken
Vielen Dank nochmals für die guten Hinweise (hab gleich alles geändert).
Das mit der Kommastelle hab ich glaub ich jetzt gut gelöst. Probleme
habe ich aber noch mit dem sprintf, da bekomme ich noch errors.
../avr_lcd.c:81: error: 'buf' undeclared (first use in this function)
../avr_lcd.c:81: error: 'Temperatur_Soll' undeclared (first use in this
function)
../avr_lcd.c:81: error: 'Komma' undeclared (first use in this function)
Irgentwie scheint die Defintion nicht zu stimmen.
>Das Problem mit 'buf' sehe ich gerade nicht.
OK, gefunden: Der Präprozessor schießt dank deiner phantasievollen
Deklarationen das uint8_t da weg und packt irgendwelchen Krempel an
dessen Stelle. --> Problem.
Ohne die define`s sind die errors weg, und es funktioniert. Nur leider
etwas zu schnell, da muss ich mir noch was einfallen lassen. Danke für
eure Hilfe.