Forum: Mikrocontroller und Digitale Elektronik Attiny2313 UART Empfang klappt nicht


von Elias F. (strangelet)


Lesenswert?

Hallo,

Ich habe das Problem das mein Attiny2313 mit dem Code unten einfach 
nicht per Uart empfangen will, der Interrupt wird nicht ausgelöst was 
ich an der LED erkennen kann.
Wenn ich den Code zum Led blinken im normalen  Code verwende blinkt die 
Led wie sie soll.
Ein externer Quarzoszillator(Ja der mit 4 Beinchen) mit 16Mhz ist dran, 
nachdem's mit dem Internen auch nicht funktioniert hat.
Die Fusebits sind richtig auf Externen Takt und ohne Clockdiv gesetzt.
Am PC Empfang ich die gesendeten Daten 1A und wenn ich mit dem PC sende 
kommen auch die richtigen Daten an, das hab ich per LA am Pin geprüft.

Also sieht irgendjemand einen Fehler in dem Code? Mir fällt einfach 
nichts mehr ein was ich noch debuggen könnte...
1
/*************************************************************************
2
Title:    Servo Cam
3
Author:   Strangelet  http://lloyd3000.wordpress.com/
4
Hardware: Attiny2313
5
      
6
**************************************************************************/
7
8
#include <stdlib.h>
9
#include <avr/io.h>
10
#include <avr/pgmspace.h>
11
#include <avr/interrupt.h>
12
#include <util/delay.h>
13
14
15
#define UART_BAUD  9600
16
17
#define UART_BAUD_CALC(UART_BAUD,F_OSC) ((F_CPU)/((UART_BAUD)*16L)-1)
18
19
#define F_CPU 16000000UL 
20
21
volatile char data;  
22
23
24
void USART_Transmit(void);
25
26
27
int main(void)
28
{
29
30
  DDRB = 0b01111110;
31
32
  UBRRH=(unsigned char)(UART_BAUD_CALC(UART_BAUD,F_CPU)>>8);
33
  UBRRL=(unsigned char)UART_BAUD_CALC(UART_BAUD,F_CPU);
34
   
35
36
  // UART Receiver und Transmitter anschalten
37
  UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
38
  // Data mode 8N1, asynchron
39
  UCSRC =  (1 << UCSZ1) | (1 << UCSZ0);
40
  
41
  sei();  
42
  
43
  data = 'x';
44
45
 
46
while(1){
47
48
   USART_Transmit();
49
   _delay_ms(200);
50
  
51
}
52
  
53
}
54
55
56
ISR(USART_RX_vect){
57
58
    PORTB |= (1<<PB2);          //Turn LEDs on
59
    _delay_ms(200);
60
    PORTB &= ~(1<<PB2);          //Turn LEDs on
61
62
63
    /* Wait for data to be received */
64
    while ( !(UCSRA & (1<<RXC)) );
65
66
    /* Get and return received data from buffer */
67
    data = UDR;
68
69
}  
70
  
71
  
72
void USART_Transmit(void)
73
{
74
    /* warten bis Senden moeglich                   */
75
    while (!(UCSRA & (1<<UDRE)))  
76
    {
77
    }
78
    /* schreibt das Zeichen x auf die Schnittstelle */
79
    UDR = data;                    
80
}

von Thomas E. (thomase)


Lesenswert?

Elias F. schrieb:
> ISR(USART_RX_vect){

Der Vektor heisst USART0_RX_vect
                       ^
                       ^
                       ^

Also 1. meckert der Compiler, weil er deinen Vektor nicht kennt und 2. 
stürzt dein Programm ab, weil es für RX keine ISR gibt.

mfg.

von Elias F. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Also 1. meckert der Compiler, weil er deinen Vektor nicht kennt und 2.
> stürzt dein Programm ab, weil es für RX keine ISR gibt.

Also 
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html 
meint auch "USART_RX_vect" Und mein Compilerer meckert auch nich, noch 
stürzt das Programm ab...

Testen kann ichs allerdings gerade nich...(hab grad mein Windows platt 
gemacht)

von Karl H. (kbuchegg)


Lesenswert?

Elias F. schrieb:

> Also
> http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
> meint auch "USART_RX_vect" Und mein Compilerer meckert auch nich, noch
> stürzt das Programm ab...

Stimmt.
Das AVR-Include File für den Tiny2313 sagt auch, dass
USART_RX_vect
korrekt ist.

Ich seh allerdings auch keinen Fehler (das delay ordne ich jetzt mal dem 
Debug-Versuch zu). Lediglich einen Schönheitsfehler.
1
    /* Wait for data to be received */
2
    while ( !(UCSRA & (1<<RXC)) );

ist unsinnig.
Die Interrupt Funktion wurde aufgerufen, WEIL ein Zeichen vorhanden ist! 
Wenn kein Zeichen da wäre, dann wäre die Funktion nicht aufgerufen 
worden. D.h. das brauchst du hier nicht testen. An dieser Stelle weißt 
du mit 100% Sicherheit, dass ein Zeichen vorhanden ist.

von Thomas E. (thomase)


Lesenswert?

Elias F. schrieb:
> http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
> meint auch "USART_RX_vect" Und mein Compilerer meckert auch nich, noch
> stürzt das Programm ab...
Interessanterweise ist das wohl so. Obwohl der Compiler laut Datenblatt 
den Vektor verweigern und demzufolge das Programm abstürzen müsste.
Somit müsste das Programm aber auch laufen.

Hardware? Lötstelle?

mfg.

von CamToCam (Gast)


Lesenswert?

Hallo,
muß F_CPU denn nicht vor der Delay.h definiert werden ?
Die Idee dahinter ist das du evtl. gar nicht sehen kannst das die Led 
leuchtet.

Die utils\setbaud.h ist übrigens sehr viel komfortabler:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

Ansonsten noch viel Erfolg bei deinem Projekt, habe sowas auch mal 
aufgebaut damit kann man nette Spielereien anstellen.
http://www.codeproject.com/Articles/10248/Motion-Detection-Algorithms

von Karl H. (kbuchegg)


Lesenswert?

CamToCam schrieb:
> Hallo,
> muß F_CPU denn nicht vor der Delay.h definiert werden ?
> Die Idee dahinter ist das du evtl. gar nicht sehen kannst das die Led
> leuchtet.

Gutes Argument.

Wobei man die ganze Delay Sache auch komplett über Bord wecrfen kann
1
ISR(USART_RX_vect)
2
{
3
    PORTB ^= (1 << PB2);
4
5
    data = UDR;
6
}

jetzt flackert die LED. Wenn alles klappt, dann ist das kaum zu 
übersehen.

von Elias F. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Hardware? Lötstelle?

OMG, ich hab den fehler gefunden dank dir :D

Ich hab das Ganze aufm Breadboard aufgebaut, allerdings hing genau die 
klammer am RX pin ein Stückchen nach unten raus, so das Zwar LA Kontakt 
zum Ft232 hatte, nur der eben genau der UC nicht :(
Ich hatte deshalb bisher alle Hardware Fehler ausgeschlossen...


CamToCam schrieb:
> Ansonsten noch viel Erfolg bei deinem Projekt, habe sowas auch mal
> aufgebaut damit kann man nette Spielereien anstellen.
> http://www.codeproject.com/Articles/10248/Motion-Detection-Algorithms

Danke Interessant werd ich mir mal anschauen ;)

Und auch nochmal Danke an alle anderen die Versucht haben mir zu helfen! 
:)

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.