mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt ATMEGA8


Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
//External Interrupt Request 0
#define INT0_vect                       _VECTOR(1)
#define SIG_INTERRUPT0                  _VECTOR(1)

ISR(INT0_vect)       // veraltet: SIGNAL(SIG_INTERRUPT0) 
{
   //Ausgabe "Test an LCD"
}

Ist dies die richtige Vorgehensweise? Ich bitte um Hilfe.

MfG Ronald

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ronald E. schrieb:

>
> //External Interrupt Request 0
> #define INT0_vect                       _VECTOR(1)
> #define SIG_INTERRUPT0                  _VECTOR(1)
> 
> ISR(INT0_vect)       // veraltet: SIGNAL(SIG_INTERRUPT0)
> {
>    //Ausgabe "Test an LCD"
> }
> 
>
> Ist dies die richtige Vorgehensweise? Ich bitte um Hilfe.

Nein.
Du definierst die Vektoren nicht selbst, sondern überlässt das dem
#include <avr/io.h>
#include <avr/interrupt.h>

diese #include machen dann schon die richtigen #define für deinen 
Prozessor, so dass du
ISR(INT0_vect)
{
  // mach was
}

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.

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, danke!
Die Ausgabe am LCD ist tatsächlich nur zum Testen, obs funktioniert.
Leider funktionierts nicht.
ISR(INT0_vect)       // SIGNAL(SIG_INTERRUPT0) 
{
        lcd_clear();
    lcd_setcursor(0,1);
    lcd_string("Test");
  _delay_ms(5000);
}

Die Interrupts habe ich global aktiviert (mit sei(); ). Das Display 
funktioniert (habs getestet). Mach ich nochwas falsch?

MfG Ronald

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Pins sind auf Eingang gestellt?

Zeig doch der Einfachheit alles her, dann braucht man nicht raten

Autor: Ronald E. (ronald_1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ohne in deinen angehängten Quelltext geschaut zu haben, ist delay 
in einer ISR eigentlich immer Schrott und einer von 5000 mit Sicherheit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main(void)
{

  lcd_init();
  int8_t puffer[7];

  //Interrupts global aktivieren
  sei();

  DDRD = 0x0;  
  
  while (1)

Ähm.
Und wo erlaubst du den externen Interrupt 0?

Im Mega8 gibt es viele Interrupts. Behandelt werden aber nur die, die 
explizit freigegeben werden!

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: ronald_1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh da hab ich mal was gelesen.
Das probier ich gleich mal aus.

Autor: Ronald E. (ronald_1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
//Interrupt wird ausgelöst bei fallender oder steigender Flanke (INT0,INT1)  
GIMSK = (1 << DDB6) | (1 << DDB7);

//Interrupts INT0, INT1 reagieren auf steigende Flanken
MCUCR = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3);

schreibst du besser:
//(INT0,INT1) Interrupt kann ausgelöst werden
GIMSK |= (1 << INT1) | (1 << INT0);

//Interrupts INT0, INT1 reagieren auf steigende Flanken
MCUCR |= (1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00);

Ist übersichtlicher und ändert nur was du auch ändern willst.

Autor: Ronald E. (ronald_1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Irgentwie scheint die Defintion nicht zu stimmen.
Das kann man so sagen:
#define uint8_t Temperatur_Soll = 10
#define uint8_t Komma = 0
#define uint8_t Speicher = 0
GRÖHL! So definiert man doch keine Variablen! Nimm die #define da weg!

Das Problem mit 'buf' sehe ich gerade nicht.

Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define uint8_t Temperatur_Soll = 10
#define uint8_t Komma = 0
#define uint8_t Speicher = 0

Das #define ist jedesmal zuviel.

Und häng mal die avr_lcd.c an, sonst ist das mit dem buf nicht klar.

Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Deklarationen
Grrr, ich meinte Definitionen.

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.