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

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