Hey
ich steh vor folgenden Problem (HW Atmega16) und zwar habe ich ein timer
(unsigned int), dessen wert als String gespeichert wird und über die
Uart ausgegeben wird. Doch bekomme ich in der Ausgabe ein Bereich von
-32768 bis +32767, obwohl doch durch das unsigned der werte Bereich nur
positiv sein sollte also 0-65535. Vllt sieht ja jemand mein Fehler.
hier mal der Code
1 | #define F_CPU 16000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <stdlib.h>
|
7 | #include <stdio.h>
|
8 |
|
9 | #define Baud 9600UL
|
10 | #define UBRR_VALUE ((F_CPU/(16*Baud))-1)
|
11 |
|
12 | unsigned int timer;
|
13 |
|
14 | /*Unterprogramme*/
|
15 |
|
16 | void uart_init()
|
17 | {
|
18 | UBRRH = (UBRR_VALUE>>8);
|
19 | UBRRL = UBRR_VALUE;
|
20 |
|
21 | UCSRB = (1<<TXEN) | (1<<RXEN);
|
22 | UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
|
23 | }
|
24 |
|
25 | void uart_senden(char ausgabe)
|
26 | {
|
27 | while (!(UCSRA & (1<<UDRE)))
|
28 | ;
|
29 | UDR = ausgabe;
|
30 | }
|
31 |
|
32 | void uart_ausgabe(char * pointer)
|
33 | {
|
34 | for (short i = 0; i<255; i++)
|
35 | {
|
36 | if(pointer[i] != 0)
|
37 | {
|
38 | uart_senden(pointer[i]);
|
39 | }
|
40 | else
|
41 | {
|
42 | break;
|
43 | }
|
44 | }
|
45 | }
|
46 |
|
47 | void timer2_init()
|
48 | {
|
49 | TCCR2 |= (1<<WGM21) | (1<<CS21) | (0<<CS20); /* CTC Aktiv + Prescaller 1:8 */
|
50 | TCNT2 = 0; /* TCNT Register nicht aktiv */
|
51 | OCR2 = 10; /* alle 60 us ein interrup in etwa 1cm */
|
52 | TIMSK = (1<<OCIE2); /* Owerflow Interrups erlauben */
|
53 | sei(); /* Aktiviert Globale Interrups */
|
54 |
|
55 | }
|
56 |
|
57 | ISR (TIMER2_COMP_vect) /* Interrup Timer2 */
|
58 | {
|
59 | timer ++; /*erhöht alle 60 us Timer um 1 */
|
60 | }
|
61 |
|
62 | int main(void)
|
63 | {
|
64 |
|
65 | char AUSGABE[10];
|
66 | uart_init();
|
67 | timer2_init();
|
68 | timer = 0;
|
69 | while (1)
|
70 | {
|
71 | itoa (timer,AUSGABE,10);
|
72 | uart_ausgabe(AUSGABE);
|
73 | uart_ausgabe("\r\n");
|
74 | }
|
75 | }
|