Atmega88 USART

Gast #522327
Lesenswert?
• ▲
▼
Hi,

nachdem sich nun das Problem mit den Interrupts gelöst hat, macht der 
USART nun nicht das, was er soll.
ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider 
kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen 
an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der 
korrekten Baudrate verschickt. Jetzt wird der geneigte Btrachter sagen, 
dass die serielle Schnittstelle defekt wäre, ist sie aber nicht. 
getestet. Vielleicht ist es wieder eine dieser kleinigkeiten, über die 
ich immer stolpere. Den Code habe ich nochmal gepostet. Vielleicht hat 
jemand ja Anregungen oder tips ?
1
//uart0.c
2

3

4

5

6

7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9

10

11
#define myBRR0 51 // BAUDRATE 9600 bps
12

13
volatile unsigned char i = 0;
14
volatile unsigned char rxFlag = 0;
15
unsigned char rxCh; 
16

17
void Uart0Init(void);
18
void putc(unsigned char ch);
19
void puts(unsigned char *str);
20

21
void Timer0(unsigned char time);
22

23

24
ISR( TIMER0_OVF_vect )
25
{
26
  
27
}
28

29
ISR( USART_RX_vect )
30
{
31
  rxCh = UDR0;
32
  putc(rxCh);
33
}
34

35

36

37

38

39
void main(void)
40
{
41
  
42
  //STATUS LEDs
43
  DDRC = (1<<5);
44
  DDRB = (1<<7);
45
  
46
  //POWER REDUCTION REGISTER
47
  PRR = (1<<7) | (1<<2) | (1<<0);
48
  
49
  Uart0Init();
50
  
51
    
52
  sei(); // Interrupts einschalten
53
  
54
  
55
  Timer0(0);
56
  
57
  for(;;)
58
  {    
59
    
60
      while( !( TIFR0 & (1<<TOV0) ) )
61
        ;
62
    
63
      
64
      while( !( UCSR0A & (1<<UDRE0) ) ) 
65
        ;
66
      UDR0 = 'a';
67
      
68
  }
69
  
70
}
71

72

73

74

75

76
void Uart0Init(void)
77
{
78
  
79

80
    UBRR0H = (unsigned char)(myBRR0 >> 8);
81
    UBRR0L = (unsigned char)myBRR0;
82
    
83
    UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
84
    
85
    UCSR0C = (3<<UCSZ00);  // 8-Bit Charaktersize
86
    
87
  
88
}
89

90

91
void puts(unsigned char *str)
92
{
93
  while(*str)
94
  {
95
    putc(*str);
96
    str++;
97
  }
98
}
99

100

101

102
void Timer0(unsigned char time)
103
{
104
  //time = vielfaches von 0,128ms
105
  /* time Lookuptable der aktueller Konfiguration 19.03.07
106
    time 0.. - 255
107
    00 = 0,00 ms
108
    10 = 1,28 ms
109
    20 = 2,56 ms
110
    30 = 3,84 ms
111
    40 = 5,12 ms
112
    50 = 6,40 ms
113
    ...
114
  */
115
  
116
  
117
  TCNT0 = 128;
118
  TIMSK0  |= (1 << TOIE0);         // Timer 0 Overflow Interrupt
119
  TCCR0B = (1<<CS01) | (1<<CS00);   // Teiler 1024  
120
  
121
  
122
}

mfg,

Simon
Gast #522331
Lesenswert?
• ▲
▼
@LC-HC

>ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider
>kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen
>an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der
>korrekten Baudrate verschickt.

Ist im Terminalprogramm die richtige Baudrate eingestellt?

MFG
Falk
Gast #522340
Lesenswert?
• ▲
▼
> Auf dem Oszi betrachtet, werden aber richtige Zeichen mit
> der korrekten Baudrate verschickt.

Daraus muss man ja wohl den Schluss ziehen, dass das Problem nicht beim 
Microcontroller liegt, oder?
Gast #522757
Lesenswert?
• ▲
▼
HI, danke für die antworten. Die DAten liegen sowohl am TTL, als auch 
zwischen Treiber und PC in gleicher Form an. Da ich aber noch nebenbei 
mit einem M16C arbeite und der ohne Probleme seine Debuganweisungen 
ausgibt, kanns der PC nicht sein. Der µC verwendet den internen 8Mhz 
Takt.
#522884
Lesenswert?
• ▲
▼
Teste mal den RS232-Treiber, indem du auf seiner TTL-Seite RX und TX 
verbindest (den AVR aus der Fassung nehmen und nen Draht in die Fassung 
stecken) und vom PC aus sendest.

Wenn die Daten dann korrekt zum PC zurückkommen: Treiber in Ordnung, 
Fehler beim AVR. Ansonsten kann der Fehler auch im Treiber liegen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.