Forum: Mikrocontroller und Digitale Elektronik UART Receiver Interrupt löst nicht aus beim ATtiny 2313


von Daniel C. (Gast)


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

von holger (Gast)


Lesenswert?

>Ich initialisiere auf 9O1 Daten-Frame

Geh auf 8N1 ohne Handshake.

von Daniel C. (Gast)


Lesenswert?

Hallo Holger,

ich brauche aber unbedingt das Format 9O1. Ist das ein Problem beim Tiny 
2313?

Ciao

Daniel

von holger (Gast)


Lesenswert?

>ich brauche aber unbedingt das Format 9O1. Ist das ein Problem beim Tiny
>2313?

Nö, aber beim PC.

von Daniel C. (Gast)


Lesenswert?

Zur Erklärung:
Ich lese Sensoren mit 9O1 Daten-Frame aus. Ich weiß, dass das Terminal 
das nicht erkennt. Es müssen aber zumindest Daten ankommen, wenn auch 
zerstückelt und unleserlich.

von H.Joachim S. (crazyhorse)


Lesenswert?

Code scheint mir richtig - Hardware auch?
Hast du dir denn mal mit nem Scope den Rx-Pin angeschaut?

von Daniel C. (Gast)


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

von Christopher G. (cbg)


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.

von Daniel C. (Gast)


Lesenswert?

Christopher G. schrieb:
> Funktionniert die LED überhaupt?


Die LED funktioniert. Ich habe sie testweise mal mit PORTD |= (1<<PD6) 
im Hauptprogramm eingeschaltet.

Hat keiner eine Idee woran es liegen könnte?

von Christopher G. (cbg)


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.

von gatsby (Gast)


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

von Daniel C. (Gast)


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.

von Christopher G. (cbg)


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.

von Daniel C. (Gast)


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

von Tek (Gast)


Lesenswert?

Nur zur Sicherheit, hast Du JP1 und JP2 auf dem Boaqrd gesetzt?
Nur dann hängt der µc auch am max232.

von Daniel C. (Gast)


Lesenswert?

Hmmm........


Ja, habe ich (hehe)!

Alle IC-Sockel haben keine Verbindung mit RX.

Ciao
Daniel

von Spaß (Gast)


Lesenswert?

Daniel C. schrieb:
> Alle IC-Sockel haben keine Verbindung mit RX.

Auch nicht der vom 2313?

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.