UART Receiver Interrupt löst nicht aus beim ATtiny 2313

Gast #2355067
Lesenswert?

Hallo zusammen,

ich verzweifel langsam bei der Aufgabe ein Signal vom PC-Terminal HTrem 
an den ATtiny 2313 zu schicken. Der Interrupt wird einfach nicht 
ausgelöst.
Ich benutze das Pollin Entwicklungsboard 2.01 und den externen Quarz mit 
8Mhz. Die Fuses habe ich im AVR Studio 5 auf 8Mhz Externer Quarz mit 
maximaler Verzögerung eingestellt.

Zum Test hab ich mal den RX und TX Pin am Ausgang des MAX 232 
kurzgeschlossen, um zu sehen ob ich ein Echo bekomme. Dabei habe ich 
festgestellt, dass das Terminal ordnungsgemäß sendet. Senden geht mit 
der USART jedoch nicht empfangen.

Hier ist mein kleines Programm. Ich initialisiere auf 9O1 Daten-Frame 
und 9600 baud. Dann schalte ich den Empfänger und Receiver ein und gebe 
den Interrupt mit RXCIE frei. Dann stelle ich eine ISR zur Verfügung mit 
dem Argument USART_RX_vect. Darin lese ich UDR aus in schreibe in ein 
Buffer. Anschließend gebe ich den Inhalt als Echo wieder an UDR aus und 
schalte eine LED ein. Im Hauptprogramm setze ich die globale 
Interrupt-Freigabe mit sei().

Soweit so gut, aber es funktioniert nicht! Auch habe ich einen anderen 
ATtiny 2313 ausprobiert, mit dem selben Ergebnis. Was mache ich falsch?

1
 
2
#include <avr/io.h>
3
#include <avr/interrupt.h>  
4

5
#define ReceiveBufferSize 100
6
uint8_t ReceiveBuffer[ReceiveBufferSize];
7
uint8_t *schreibzeiger;
8

9

10
void init_UART_9O1(void)
11
{
12
  UBRRH = 0;
13
  UBRRL = 51; // Teiler = Systemtakt / (16 * Baud) - 1 = 51 gerundet, bei 9600 baud
14
  
15
  UCSRC &= ~(1 << UMSEL);  // asynchrone Übertragung
16

17
  UCSRB |= (1<<UCSZ2); 
18
  UCSRC |= (1<<UCSZ1) | (1<<UCSZ0); // 9 Daten-Bits
19
  
20
  UCSRC |= (1<<UPM1) | (1<<UPM0); // odd Parität
21
  
22
  UCSRC &= ~(1<<USBS); // 1 Stop-Bit
23
} 
24

25

26
void enable_RECEIVER(void)
27
{
28
  UCSRB |= (1<<RXEN); // Empfänger einschalten
29
  UCSRB |= (1<<TXEN); // Sender einschalten
30
  
31
  UCSRB |= (1<<RXCIE); // Empfänger-Interrupt einschalten
32
}  
33

34

35
ISR(USART_RX_vect)            
36
{
37
  *schreibzeiger = UDR;
38
  UDR = *schreibzeiger; //Echo
39
  schreibzeiger++;
40
  if(schreibzeiger == ReceiveBuffer + ReceiveBufferSize) schreibzeiger = ReceiveBuffer;
41
  PORTD |= (1<<PD6); //LED einschalten
42
}
43

44
int main(void)
45
{
46
  schreibzeiger = ReceiveBuffer;
47
  DDRD |= (1<<DDD6); //PIND 6 als Ausgang für LED
48

49
  init_UART_9O1();
50
  enable_RECEIVER();
51
  
52
  sei(); // globale Interrupt-Freigabe
53

54
  while(1)
55
  {  
56
  }    
57
}

Ciao

Daniel
Gast #2355135
Lesenswert?

Wenn ich den Sensor an den RX-Pin vom Tiny lege passiert nichts. Lege 
ich ihn direkt an den Max 232 kann ich den Datenstrom am Terminal 
auslesen. Das serielle Sensorsignal scheint in Ordnung zu sein.

Das die Interrupt-Routine nicht erreicht wird sieht mann auch daran, 
dass die LED nicht eingeschaltet wird.

Kann es sein, dass die Interrupt-Einsprungadressen falsch vom Compiler 
gesetzt wurden?

Ciao

Daniel
#2355186
Lesenswert?

Funktionniert die LED überhaupt? Eine andere Ausgabemethode hast du ja 
derzeit nicht. [EDIT] Übersehen, dass du die Daten zurücksendest. 
[/EDIT]

Hat zwar erst Bedeutung, wenn du in die ISR kommst aber wenn du 9 
Datenbits hast, dann musst du sie auch korrekt auslesen, auch wenn du 
nur (absichtlich?) die unteren 8 Bits abspeicherst.
Datasheet UCSRB Register:
Bit 1 – RXB8: Receive Data Bit 8
RXB8 is the ninth data bit of the received character when operating with 
serial frames with nine
data bits. Must be read before reading the low bits from UDR.

Selbiges gilt dann auch fürs senden mit TXB8.
#2355764
Lesenswert?

Also, halten wir mal fest:
- LED geht
- Sensor geht
- Code passt in etwa (manchmal vertraust du auf die Defaultwerte der 
Register)

Hast du mal die Leitung vom Sensor zum ATTiny kontrolliert (d.h. 
durchgepiepst und gemessen)? Am richtigen Pin angeschlossen? Für den 
richtigen ATTiny kompiliert?

Was anderes, wenn du hier mit dem Sensor testest, warum schickst du ihm 
dann die Daten zurück? Oder testest du mit dem PC? Dann geht 9O1 nicht.
Gast #2355833
Lesenswert?

Hallo,

schau mal im Datenblatt bei UCSRB


• Bit 1 – RXB8: Receive Data Bit 8
RXB8 is the ninth data bit of the received character when operating with 
serial frames with nine data bits. Must be read before reading the low 
bits from UDR.

• Bit 0 – TXB8: Transmit Data Bit 8
TXB8 is the ninth data bit in the character to be transmitted when 
operating with serial frames with nine data bits. Must be written before 
writing the low bits to UDR


Viel Erfolg
gatsby
Gast #2356039
Lesenswert?

Christopher G. schrieb:
> - Code passt in etwa (manchmal vertraust du auf die Defaultwerte der
>
> Register)
>
>
>
> Hast du mal die Leitung vom Sensor zum ATTiny kontrolliert (d.h.
>
> durchgepiepst und gemessen)? Am richtigen Pin angeschlossen? Für den
>
> richtigen ATTiny kompiliert?
>
>
>
> Was anderes, wenn du hier mit dem Sensor testest, warum schickst du ihm
>
> dann die Daten zurück? Oder testest du mit dem PC? Dann geht 9O1 nicht.

Stimmt manchmal vertraue ich einfach den Defaultwerten. Vielleicht 
sollte ich die Register byte weise adressieren. Danke! Das ist ein 
Anhaltspunkt.

Also der Sensor gibt seine Daten einwandfrei raus. Das habe ich mit dem 
Pegelwandler MAX 232 und dem PC getestet. Der tiny bekommt definitiv 
Daten am RX-Eingang "PD0" bereitgestellt.
Ich benutze den ATtiny 2313 ohne Zusatz "a", da bin ich mir ganz sicher, 
das habe ich auch im AVR Studio so eingestellt.

Das Terminalprogramm HTerm habe ich nur Testweise verwendet um zu 
prüfen, ob überhaupt Signale empfangen werden. Ich benutze den Sensor an 
PD0 als Datenquelle. In der Interrupt-Routine gebe ich zu Testzwecken 
das Signal an das PC-Terminal weiter. So gesehen also kein Echo an den 
Sender. 9O1 geht mit dem PC, wenn mann das Paritätsbit opfert. Dann 
kommt aber nur Schrott raus.
#2356182
Lesenswert?

Woher weißt du, dass der Tiny Daten bekommt? Nur weil der Sensor sie 
ausgibt heisst das noch lange nichts. Hast du die physikalische 
Verbindung von Tiny zu Sensor geprüft (Datenleitung, GND, ggf VCC)?
Halte dich mal an die wiederholt gepostete Vorgehensweise für 9 
Datenbits, sofern noch nicht geschehen. Zusätzlich noch die LED als 
allererstes in der ISR andrehen, bevor du irgendwas anderes machst.
Gast #2363626
Lesenswert?

Ich habe den Tiny aus der Schaltung genommen und RX und TX am IC-Sockel 
verbunden. Ich bekomme kein Echo am PC-Terminal! Also ist mein 
Entwicklungsboard defekt.

Naja, das wollte ich nur mitteilen damit der Thread zu einem sinnvollen 
Abschluß kommt.  Der obige Code funktioniert übrigens einwandfrei!

Danke an alle, die versucht haben mir zu helfen.

Ciao

Daniel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren