Forum: Compiler & IDEs USART TXC Interrupt


von guest (Gast)


Lesenswert?

Hallo,

ich versuche den USART via Interrupt zu nutzen. Angesteuert werden soll 
ein Schieberegister einfaches Schieberegister.
Mein Problem beginnt allerdings schon damit das der Interrupt vektor 
garnicht angesprungen wird und ich mir keinen Reim darauf machen kann 
warum dem so ist.

Ich habe testweise eine LED an PORTC Pin 1 angehängt die ich anfangs an 
mache und im interrupt ausschalte.
Allerdings wird dieser wie erwähnt nicht angesprungen.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
int main(void)
6
{  
7
  DDRD = 0xFF;
8
  DDRB = 0xFF;
9
  DDRC = 0xFF;  
10
  PORTC= 0xFF;  //test led an
11
12
  //---USART config registers---  
13
  //UCSRA |= (1<<UDRE);
14
  UCSRB |= (1<<TXCIE) | (1<<TXEN); //rxc interrupt enable, transmitter enable alternative: 1<<TXCIE
15
  UCSRC |= (1<<URSEL) | (1<<UMSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); //synchron, 8-bit, Rising XCK Edge
16
  UBRRL=25; //2400bps error 0.2%
17
  sei();
18
  while(1) 
19
  {
20
    PORTC=0xFF;
21
  }
22
}  
23
24
ISR(USART_TXC_vect) 
25
{
26
   
27
  UDR=0xFF;
28
  while ( !(UCSRA & (1<<UDRE)) );
29
  PORTB = 0x00;
30
  _delay_us(10);
31
  PORTB = 0x00;
32
  
33
  PORTC = 0x00; //schaltet test led aus 
34
}

von Karl H. (kbuchegg)


Lesenswert?

guest schrieb:

> Mein Problem beginnt allerdings schon damit das der Interrupt vektor
> garnicht angesprungen wird und ich mir keinen Reim darauf machen kann
> warum dem so ist.

Warum sollte der angesprungen werden?
Du sendest ja nie irgendwas.

TXC  bedeutet  "Transmit Complete"

Übergibst du der UART nie was zum Senden, wird die logischerweise auch 
nie mit dem Versenden eines Bytes fertig (complete). Keine 
Fertigstellung - kein Complete Interrupt.

von guest (Gast)


Lesenswert?

Danke, ich hatte mir irgendwie zusammen gereimt das ein leeres 
UDR==fertig gesendet bedeutet. Habe das ganze auf UDRIE geändert, der 
interrupt geht jetzt soweit.

Allerdings bin ich auf das Problem gestoßen das der USART Transmitter 
immer ein Stop Bit oder wahlweise Zwei Stop Bits mitsendet. Lässt sich 
das irgendwie umgehen? Denn zusammen mit einem Schieberegister ist das 
irgendwie schlecht.

von Stefan E. (sternst)


Lesenswert?

guest schrieb:
> Allerdings bin ich auf das Problem gestoßen das der USART Transmitter
> immer ein Stop Bit oder wahlweise Zwei Stop Bits mitsendet. Lässt sich
> das irgendwie umgehen? Denn zusammen mit einem Schieberegister ist das
> irgendwie schlecht.

Gibt es irgendeinen Grund, warum du nicht das SPI benutzt?

von Karl H. (kbuchegg)


Lesenswert?

guest schrieb:

> Allerdings bin ich auf das Problem gestoßen das der USART Transmitter
> immer ein Stop Bit oder wahlweise Zwei Stop Bits mitsendet. Lässt sich
> das irgendwie umgehen? Denn zusammen mit einem Schieberegister ist das
> irgendwie schlecht.

Ähm. Was ist denn das für ein Schieberegister, in welches man mit einer 
USART reingeht?

von guest (Gast)


Lesenswert?

Mein Schieberegister ist ein 74HC595.

Mir kam die Idee den USART dafür zunutzen, weil er sich auf dem ersten 
Blick einfach anbot. Es funktioniert ja auch, bis auf die Stop Bit 
Geschichte hmpf

Der von Stephan vorgeschlagene SPI ist dann wohl vermutlich sinnvoller 
:(

Oder wie würde man sowas "richtig" lösen?

von Karl H. (kbuchegg)


Lesenswert?

guest schrieb:

> Oder wie würde man sowas "richtig" lösen?

mit der SPI.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.