main.c


1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
#ifndef F_CPU
6
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
7
   F_CPU im Makefile definiert werden, eine nochmalige Definition
8
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
9
   #ifndef/#endif
10
11
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
12
   verwendet wird und dort eine andere, nicht zur Hardware passende
13
   Taktrate eingestellt ist: Dann wird die folgende Definition
14
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
15
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
16
   noch nicht definiert: */
17
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
18
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten
19
// Ohne ergeben sich unten Fehler in der Berechnung
20
#endif
21
22
#define BAUD 9600UL      // Baudrate
23
24
// Berechnungen
25
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
26
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
27
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
28
29
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
30
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
31
#endif
32
33
int uart_putc(unsigned char c)
34
{
35
  while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
36
  {        }
37
38
  UDR0 = c;                      /* sende Zeichen */
39
  return 0;
40
}
41
42
void uart_puts (char *s)
43
{
44
  while (*s)
45
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
46
    uart_putc(*s);
47
    s++;
48
  }
49
}
50
51
int main(void)
52
{
53
  int16_t i = 0;
54
  char s[7];
55
56
//  PORTB |= (1<<PB7);
57
  DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5) | (1<<DDB6) | (1<<DDB7);
58
59
  UBRR0H = UBRR_VAL >> 8;
60
  UBRR0L = UBRR_VAL & 0xFF;
61
62
  UCSR0B |= (1<<TXEN0);                     // UART TX einschalten
63
  UCSR0C = (1 << UCSZ01)|(1 << UCSZ00);   // Asynchron 8N1
64
65
66
67
  for (;;) {                           /* loop forever */
68
69
    uart_putc(0x1B);  // erase Screen
70
    uart_putc('[');
71
    uart_putc('2');
72
    uart_putc('J');
73
74
    itoa(i++, s, 10);
75
    uart_puts(s);
76
77
    PORTB ^= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
78
79
    _delay_ms(250);
80
    _delay_ms(250);
81
82
  }
83
}