Hallo,
suche verzweifelnd den Fehler in meinem Code...
Habe die Beiträge studiert, es gibt sogar ähnliche Beiträge, doch ich
bekomme meinen Atmega 32 intern mit 8MHZ getacktet nicht zum laufen. Ich
nutze Programmers Notepad mit einem Beispielmakefile welches früher für
einen Atmega64 erzeugt wurde.
Viele andere Funktionen habe ich auf meiner Platine schon umgesetzt und
zum laufen gebracht, somit gehe ich nicht von irgendwelchen Hardware
fehlern aus.
Hier mein derzeitiger Testcode:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdlib.h>
|
4 | #include <util/delay.h>
|
5 | #include <stdio.h>
|
6 |
|
7 |
|
8 | #include "macro.h"
|
9 | #include "konstanten.h"
|
10 | #include "lcd.h"
|
11 |
|
12 |
|
13 | char txt[16];
|
14 |
|
15 | ////////////////////////////////////////////////////////////////////////////////
|
16 | // TIMERINTERRUPT0
|
17 | // wird alle 9,98ms durchlaufen
|
18 | ISR (TIMER0_COMP_vect)
|
19 | {
|
20 |
|
21 | //toggle(PORTB,LED);
|
22 | out_h(PORTB,LED);
|
23 | }
|
24 |
|
25 | ////////////////////////////////////////////////////////////////////////////////
|
26 | // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
|
27 | // Timer 0 wird auf 9,98ms eingestellt
|
28 | void timer0_init(void)
|
29 | {
|
30 | // Vorteiler | No clock source | clk | clk/32 | clk/64 | clk/128 | clk/256 | clk/1024
|
31 | TCCR0 |= (1<<CS02); // | 0 | 0 | 0 | 1 | 1 | 1 | 1
|
32 | TCCR0 |= (1<<CS01); // | 0 | 0 | 1 | 0 | 0 | 1 | 1
|
33 | TCCR0 |= (1<<CS00); // | 0 | 1 | 1 | 0 | 1 | 0 | 1
|
34 |
|
35 | // Der Compare Interrupt Handler Wird aufgerufen wenn TCNT0 mit OCR0 übereinstimmt
|
36 | // | OCR nutzen | Normal |
|
37 | TCCR0 |= (1<<WGM01); // | 1 | 0
|
38 | TCCR0 &= ~(1<<WGM00); // | 0 | 0
|
39 |
|
40 | // Timer Interrupt Mask - TIMSK | Compare Interrupt
|
41 | TIMSK |= (1<<OCIE0); // | 1
|
42 |
|
43 | OCR0 = 78;
|
44 | // BSP.: (1 / (CLK / Vorteiler)) * OCR = Zeit
|
45 | // BSP.: Zeit / (1 / (CLK / Vorteiler)) = OCR
|
46 |
|
47 | }
|
48 |
|
49 | int main (void)
|
50 | {
|
51 | unsigned char test=88;
|
52 | unsigned char count=0;
|
53 |
|
54 | set_out(DDRB,LED); // LED auf der Platine als Ausgang
|
55 |
|
56 | lcd_init();
|
57 | timer0_init();
|
58 | sei(); // Alle globalen Interruptquellen Einschalten
|
59 |
|
60 |
|
61 | while(1)
|
62 | {
|
63 | if(test != TCNT0)
|
64 | {
|
65 | test = TCNT0;
|
66 | count++;
|
67 | sprintf(txt,"%3d",count);
|
68 | lcd_setcursor(0,2);
|
69 | lcd_string(txt);
|
70 | }
|
71 |
|
72 | sprintf(txt,"%3d %3d",OCR0,TCNT0);
|
73 | lcd_setcursor(0,1);
|
74 | lcd_string(txt);
|
75 | lcd_baglight();
|
76 | }
|
77 |
|
78 | /* wird nie erreicht */
|
79 | return 0;
|
80 | }
|
Auf meinem Display steht folgendes:
78 0
1
somit gehe ich davon aus das TCNT0 nicht inkrementiert wird.
Woran liegt das?
Kann evtl. das makefile ein solches Problem aauslösen?
Ziel meiner Software soll es sein, einen ca. 10ms Interrupt auszulösen.
Vielen Dank für Eure Hilfe
Heiko