Uart IRQ auf dem ATtiny87

Gast #3120042
Hallo,

nach einigen Versuchen wende ich mich nun an Euch. Ich habe einen 
ATtiny87 und verwende dabei die UART.

Senden und Empfangen funktioniert, jedoch nur pollend. Danach habe ich 
versucht dies Interrupt-gesteuert zu realisieren. Beim Senden ging das 
ohne Probleme, jedoch finde ich fürs Empfangen keinen Interrupt.Vektor.

Die UART ist bei dem ATtiny87 im LIN-Controller integriert. Folgendes 
habe ich Initialisiert:

1
void UartInit(){
2
  LINCR = (1<<LENA) | (1<<LCMD0) | (1<<LCMD1) | (1<<LCMD2); // enable UART in 8bit Full Duplex Mode
3
  unsigned int  ubrr = (F_CPU/32/BAUDRATE)-1;    //calculate Baudrate
4
  LINBRRH = ubrr >> 8;
5
  LINBRRL = ubrr & 0xFF;
6
  LINENIR = (1<<LENTXOK) | (1<<LENRXOK);  // Transmit and Receive IRQ enable
7
  BufferPos = 0;
8
}
Gast #3120075
Welchen Interrupt Vector verwendest du denn?

So wie ich das sehe gibt es nur einen Transfer Complete Handler, also 
für RX und TX gemeinsam. Aber ich bin da nicht der Interrupt-Spezi. Aber 
vielleicht hilft es dir trotzdem weiter.

Ansonsten würde der gesamte Code auf jeden Fall weiter helfen.
Gast #3120190
oh sry glad vergessen


interrupt sieht so aus:
1
void UartInit(){
2
  LINCR = (1<<LENA) | (1<<LCMD0) | (1<<LCMD1) | (1<<LCMD2); // enable UART in 8bit Full Duplex Mode
3
  unsigned int  ubrr = (CPU_CLOCK/32/BAUDRATE)-1;    //calculate Baudrate
4
  LINBRRH = ubrr >> 8;
5
  LINBRRL = ubrr & 0xFF;
6
  LINENIR = (1<<LENTXOK) | (1<<LENRXOK);  // Transmit and Receive IRQ enable
7
  BufferPos = 0;
8
}
9

10
ISR(LIN_TC_vect){
11
  for(;;){
12
          PORTB ^= 2;
13
  }  
14
}

einfach nur pin toggeln um es zusehen wenn etwas passiert.
Tut sich aber leider bisher nichts.
Gast #3120193
Ich sehe auch keinen Code.

Wenn meine Theorie stimmt das der 87er nur ein Interrupt für RX und TX 
bietet dann versuche mal den LENTXOK wegzulassen, also nur den RX 
Interrupt aktivieren. Dann sollte er in den LIN_TC_vect nur springen 
wenn etwas auf RX reinkommt.

Falls das so funktioniert, müsstest du dann im vollständigen Code 
RX-Interrupt und TX-Interrupt abwechselnd an und abschalten, je nachdem 
was du gerade brauchst. Oder du kannst das über ein zusätzliches Flag 
abfragen.

Haut mich wenn ich Blödsinn erzähle :-)
Gast #3120196
Habe LENTXOK nun rausgenommen aber der Interrupt wird nicht 
angesprungen. An dem Pin tut sich nichts aber der Pin in der 
Main-schleife(PORTB ^= 1) toggelt nicht mehr.
Gast #3120367
zu abstrakt um alles zu posten...
habe den Interrupt nun hinbekommen aber mit einem Vector der nicht dafür 
vorgesehen ist (BADISR_vect).
Ist nicht schlimm aber auch nicht schön..
Habe wie schon gesagt schon LIN_TC_vect & LIN_ERR_vect für den ATTiny87 
probiert aber die sind es nicht für UartRX
#3120446
@ Michael Nienhaus (Gast)

>habe den Interrupt nun hinbekommen aber mit einem Vector der nicht dafür
>vorgesehen ist (BADISR_vect).
>Ist nicht schlimm aber auch nicht schön..

Es ist Murks.

>Habe wie schon gesagt schon LIN_TC_vect & LIN_ERR_vect für den ATTiny87
>probiert aber die sind es nicht für UartRX

Nimm die gescheiten Namen aus dem Datenblatt und setze auch das 
RICHTIGE, zugehörige Interrupt Enable Bit.

>Habe wie schon gesagt schon LIN_TC_vect & LIN_ERR_vect für den ATTiny87
>probiert aber die sind es nicht für UartRX

Wenn ich das Datenblatt richtig verstehe, ist LIN_TC_vect der einzige 
Vector bei diesem AVR, der für RX und TX benutzt wird. Dort muss man per 
Polling prüfen, ob es ein RX oder TX Interrupt war.
Gast #3121163
Falk Brunner schrieb:
> Nimm die gescheiten Namen aus dem Datenblatt und setze auch das
> RICHTIGE, zugehörige Interrupt Enable Bit.



Ich habe lt. Datenblatt folgende Flags gesetzt:

LINENIR = (1<<LENTXOK) | (1<<LENRXOK);  // Transmit and Receive IRQ 
enable

Damit sollten die IRQs enabled sein. Jetzt muss ich diesen IRQ auch mit 
der zugeh. ISR, also dem entspr. Vector abfangen:

ISR(LIN_TC_vect){
          PORTB ^= 2;
}

Dies ist auch lt. Datenblatt der Vector. Fakt ist, dass mit diesen 
Einstellungen der Interrupt nicht kommt. (ja, der Pin ist vorher auf 
Ausgang gestellt worden, der Pin funktioniert auch (Test in der Main 
loop) also ist ein HW Schaden am Port B auszuschließen.)

Warum dieser Interrupt nicht kommt, ist unklar. Auch das Macro Sei(); 
haben wir genutzt, die Benutzung von Interrupts ist uns auch geläufig.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.