mikrocontroller.net

Forum: Compiler & IDEs Intterrupt funktioniert nicht


Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute!

ich möchte sobald ein High-Pegel an INT0 meines AT90S8515 anliegt, einen 
Interrupt auslösen, der dann über den UART 0xFF schickt, sobald der 
Buffer frei ist.

Warum funktioniert das nicht?




#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>



ISR (INT0_vect) 
{
  
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
    
 
    UDR = 0xFF;
      
}

int main(void) 
{
    
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  

  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;


  sei();                                    //Interrupts zulassen

    while (1); 
  
    return 0;
}





Tastenentprellung ist noch nicht eingebaut, ist klar! Es sollte aber 
trotzdem schon was ankommen, wenn ich mit einem Draht von Vcc auf den 
Int0-PIN gehe....

Vielen Dank!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär's, wenn du INT0 überhaupt erst einmal als Interrupt-Eingang 
definierst?

Dazu kommt, dass der Anschluss schon vorher high sein kann, wenn er 
offen ist und keiner da ist, der ihn runterzieht.

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich hab noch die Zeile   "DDRD = 0x00;" eingefügt. Funktioniert 
trotzdem nicht. Habe die Spannung zwischen GND und INT0 gemessen, ist 0V 
potenzial.


funktioniert also nicht ;)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, was Andreas meint, ist, dass du den INT0-Interrupt noch 
freischalten musst.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meik wrote:

> Habe die Spannung zwischen GND und INT0 gemessen, ist 0V
> potenzial.

Miss mal die Spannung zwischen VCC und INT0. Wetten dass da auch 0V 
rauskommt?

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja da haste Recht.

hm....Ich dachte mit sei() würde man das Interrupt Enable Flag setzen? 
Was benötigt man denn noch außer diesem Makro?

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der Aktuelle Code:

 -> Funktioniert immer noch nicht.





#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>



ISR (INT0_vect) 
{
  
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
 
    UDR = 0x67;
      
}

int main(void) 
{
  
    
  MCUCR |= (1<<ISC01) | (1<<ISC00);      // Interrupt auslösen bei steigender Flanke
  GICR |= (1<<INT0);
  
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  

  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  DDRD = 0x00;


  sei();                                    //Interrupts zulassen

    while (1); 
  
    return 0;
}




Danke!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meik wrote:

>  -> Funktioniert immer noch nicht.

Lässt sich nichtmal compilieren, da du allerlei Registernamen benutzt,
die es beim AT90S8515 gar nicht gibt.

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, es ist ein ATMega8515 und kein AT90S8515!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) Pulldown an den Port hängen.
2) Versuch mal in main was zu senden, um zu sehen, ob das Senden 
generell funktioniert.

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Senden funktioniert generell schon, habe zwar auch gerade ein 
Phänomen entdeckt, siehe:

Ein Ausschnitt aus deinem Vorschlag (main-Funktion):

int y;

for (y=0;y<10;y++)
{
   UDR = 64;
}


Was kam raus: er hat nur 2 Zeichen auf dem Terminal ausgegeben.

Autor: Thomas B. (detritus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also jetzt mal konkret:

Welche Flags in welchen Registern benötige ich für einen INT0 bei 
steigender Flanke?

Findet man nicht wirklich im Tutorial.

Was stimmt noch nicht?


Danke

Autor: Meik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es funktioniert jetzt:

Mit folgendem CODE:




#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>



ISR (INT0_vect) 
{
  
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
 
    UDR = 0x41;
      
}

int main(void) 
{
  
    
  MCUCR |= (1<<ISC01) | (1<<ISC00);      // Interrupt auslösen bei steigender Flanke
  GICR |= (1<<INT0);
  
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  

  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  DDRD = 0x00;


  sei();                                    //Interrupts zulassen

    while (1); 
  
    return 0;
}







Danke!

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.