Forum: Mikrocontroller und Digitale Elektronik ATtiny841 : UART0


von Stefan S. (sschultewolter)


Lesenswert?

Hallo,

ich habe den UART1 soweit am ATtiny841 ans laufen bekommen. Getestet 
wird mit dem internen Oszillator (8MHz).

Angeschlossen habe ich einen FTDI. GND(FTDI) - GND(AVR) und RX(FTDI) - 
TX(AVR).

An UART1 geht alles wunderbar. Von UART2 wird aber nichts gesendet. Die 
Tx LED von dem FTDI bleibt aus und im Putty kommt auch nichts an.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// UART0
5
#define UART0_BAUD 9600UL
6
#define UART0_UBRR_VAL ((F_CPU+UART0_BAUD*8)/(UART0_BAUD*16)-1)
7
#define UART0_BAUD_REAL (F_CPU/(16*(UART0_UBRR_VAL+1)))
8
#define UART0_BAUD_ERROR ((UART0_BAUD_REAL*1000)/UART0_BAUD)
9
10
#if ((UART0_BAUD_ERROR<990) || (UART0_BAUD_ERROR>1010))
11
#error Systematischer Fehler der Baudrate(UART0) groesser 1% und damit zu hoch!
12
#endif
13
14
void uart0_init(void)
15
{
16
  UBRR0 = UART0_UBRR_VAL;
17
  UCSR0B |= (1 << TXEN0);
18
  UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
19
}
20
21
int uart0_putc(uint8_t c)
22
{
23
  while(!(UCSR0A & (1<<UDRE0))) {}
24
  
25
  UDR0 = c;
26
  return 0;
27
}
28
29
void uart0_puts (char *s)
30
{
31
  while (*s)
32
  {
33
    uart0_putc(*s);
34
    s++;
35
  }
36
}
37
38
// UART1
39
#define UART1_BAUD 9600UL
40
#define UART1_UBRR_VAL ((F_CPU+UART1_BAUD*8)/(UART1_BAUD*16)-1)
41
#define UART1_BAUD_REAL (F_CPU/(16*(UART1_UBRR_VAL+1)))
42
#define UART1_BAUD_ERROR ((UART1_BAUD_REAL*1000)/UART1_BAUD)
43
44
#if ((UART1_BAUD_ERROR<990) || (UART1_BAUD_ERROR>1010))
45
#error Systematischer Fehler der Baudrate(UART1) groesser 1% und damit zu hoch!
46
#endif
47
48
void uart1_init(void)
49
{
50
  UBRR1 = UART1_UBRR_VAL;
51
  UCSR1B |= (1 << TXEN1);
52
  UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);
53
}
54
55
int uart1_putc(uint8_t c)
56
{
57
  while(!(UCSR1A & (1<<UDRE1))) {}
58
  
59
  UDR1 = c;
60
  return 0;
61
}
62
63
void uart1_puts (char *s)
64
{
65
  while (*s)
66
  {
67
    uart1_putc(*s);
68
    s++;
69
  }
70
}
71
72
73
volatile uint32_t _millis;
74
volatile uint32_t millis;
75
volatile uint16_t second;
76
77
ISR(TIMER0_COMPA_vect)
78
{
79
  _millis++;
80
  millis++;
81
82
  if(millis == 1000)
83
  {
84
    second++;
85
    millis = 0;
86
  }
87
}
88
89
90
  int main(void)
91
  {
92
    // UART
93
    uart0_init();
94
    uart1_init();
95
    
96
    // millis
97
    TCCR0A = (1 << WGM01);          // CTC Modus
98
    TCCR0B |= (1 << CS01) | (1 << CS00);  // Prescaler 64
99
    OCR0A = 124;              // (F_CPU/PRESCALER)/1000-1
100
    TIMSK0 |= (1 << OCIE0A);        // Compare Interupt erlauben
101
    sei();
102
    
103
    while(1)
104
    {
105
      static uint16_t last_second;
106
      if(last_second != second)
107
      {
108
        last_second = second;
109
        
110
        char str[10];
111
        uart0_puts("UART0 >> ");
112
        itoa(second, str, 10);
113
        uart0_puts(str);
114
        uart0_puts("\n\r");
115
        
116
        
117
        uart1_puts("UART1 >> ");
118
        itoa(second, str, 10);
119
        uart1_puts(str);
120
        uart1_puts("\n\r");
121
      }
122
    }
123
  }

von Oliver R. (orb)


Lesenswert?

Welche Pins nutzt Du denn PA1/PA2 oder PA7/PB2?
Default währe PA1/PA2, für PA7/PB2 müßtest Du U0MAP in REMAP setzen.

von Stefan S. (sschultewolter)


Lesenswert?

Ich war blind!

Habe garnicht gesehen, dass RX0/TX0 auch auf PortA sich befindet.

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.