644UART.c


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
volatile unsigned char ein;
6
unsigned char akku;
7
8
void Konfiguration(void)
9
{
10
  DDRB = 255; //PortB als Output konfigurieren
11
  DDRD = 0;  //PortD als Input konfigurieren
12
13
  EICRA |= (1<<ISC01);  //INT0 gibt Interrupt bei fallender Flanke
14
  EICRA |= (0<<ISC00);
15
  EICRA |= (1<<ISC11);  //INT1 gibt Interrupt bei fallender Flanke
16
  EICRA |= (0<<ISC10);
17
18
  EIMSK |= (1<<INT0);    //INT0 enabled
19
  EIMSK |= (1<<INT1);    //INT1 enabled
20
21
  UBRR0H = 0;        //Baudrate = fosc/(16 (UBRR + 1))
22
  UBRR0L = 9;        //18,423MHz und 115200 Baud
23
24
  UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);  //8Bit pro Word
25
  UCSR0B |= (1<<TXEN0);  //UART Sender ein
26
}
27
28
void uart_putc(unsigned char data)
29
{
30
   while (!(UCSR0A & (1<<UDRE0)));  // Wait for previous transmission
31
   UDR0 = 'A';           // Send data byte
32
}
33
34
35
36
void main(void)
37
{
38
  unsigned char zaehlera;
39
  unsigned char zaehlerb;
40
  
41
  Konfiguration();
42
  
43
  zaehlera = 0;
44
  zaehlerb = 0;
45
  ein = 1;
46
47
  sei();          //Interrupts aktivieren
48
49
  while(1)
50
  {
51
    PORTB = 255 - akku;
52
    if ((zaehlera == 0) & (ein == 1))
53
    {
54
    zaehlerb++;
55
    if (zaehlerb ==0)
56
      {
57
      PORTB = 255 - akku;
58
      uart_putc(akku);
59
      akku++;
60
      }
61
    }
62
    zaehlerb++;
63
  zaehlera++;
64
  }
65
}
66
67
ISR(INT0_vect)
68
{
69
  ein = 1;
70
}
71
72
ISR(INT1_vect)
73
{
74
  ein = 0;
75
}
76
77
/*Baud  UBRR  % of error 
78
300    3839  0.0
79
600    1919  0.0
80
1200  959    0.0
81
2400  479    0.0
82
4800  239    0.0
83
9600  119    0.0
84
14400  79    0.0
85
19200  59    0.0
86
28800  39    0.0
87
38400  29    0.0
88
57600  19    0.0
89
76800  14    0.0
90
115200  9    0.0
91
230400  4    0.0*/