ok dann schau mal drüber vielleicht siehst du ja was was ich falsch
mache.
variablen Tabellen lass ich mal weg die brauchen zu fiel platz.
1 | #include <stdint.h>
|
2 | #include <string.h>
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 |
|
6 | int main()
|
7 | {
|
8 | DDRA = 0xFF;
|
9 | DDRC = 0xFF;
|
10 | DDRD = 0x00;
|
11 | DDRB = 0x00;
|
12 |
|
13 | //ext inetrupt
|
14 | GIMSK |= (1<<INT1); //(External Interrupt Request 1 Enable)
|
15 | GIMSK |= (1<<INT0); //(External Interrupt Request 0 Enable)
|
16 | MCUCR |= (1<<ISC11); //Die steigende Flanke an INT1 erzeugt einen Interrupt
|
17 | MCUCR |= (1<<ISC10); //Die steigende Flanke an INT1 erzeugt einen Interrupt
|
18 | MCUCR |= (1<<ISC01); //Die steigende Flanke an INT0 erzeugt einen Interrupt.
|
19 | MCUCR |= (1<<ISC00); //Die steigende Flanke an INT0 erzeugt einen Interrupt.
|
20 |
|
21 |
|
22 | // Timer 1 konfigurieren (16bit)
|
23 | TCCR1B |= (1<<WGM12); // CTC Modus
|
24 | // TCCR1B |= (1<<CS12); // Prescaler 256/1024
|
25 | TCCR1B |= (1<<CS11); // Prescaler 8 /64
|
26 | // TCCR1B |= (1<<CS10); // Prescaler 64/1024/1
|
27 | // (16000000/64/1600) = 156,25
|
28 | // (16000000/8/408000) = 4,9
|
29 | OCR1A= 20000;
|
30 | // Compare Interrupt erlauben
|
31 | TIMSK |= (1<<OCIE1A);
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | // Global Interrupts aktivieren// Global Interrupts aktivieren
|
39 | sei();
|
40 | //hauptrotine
|
41 | while( 1 )
|
42 | {
|
den code zum füllen des RAMs (neues Bild) lass ich auch weg der greift
in den anderen code nicht ein.
1 |
|
2 | ISR(INT0_vect)
|
3 | {
|
4 | TCNT1 = 0; //sync Timer
|
5 | y=0; //sync Bild
|
6 | OCR1A = 1; //direkter aufruf time interupt
|
7 | }
|
8 | ISR(INT1_vect)
|
9 | {
|
10 | y++; //sync Zeile Zählen
|
11 | if (y==16)y=0;
|
12 | i=y*16; //sync Zeile PWMwert
|
13 | PORTA = 0x00; //Verhindert schaten von vorhergegangener zeile Port A
|
14 | PORTC = 0x00; //Verhindert schaten von vorhergegangener zeile Port C
|
15 | }
|
16 | //time interupt
|
17 | ISR (TIMER1_COMPA_vect)
|
18 | {
|
19 | cli();
|
20 | OCR1A = coderunT[i]; //Aktualisirung Zeitwert OCR1A
|
21 | PORTA = coderunA[i]; //Aktualisirung Port A
|
22 | PORTC = coderunC[i]; //Aktualisirung Port C
|
23 | i++;
|
24 | sei();
|
25 | }
|
die ersten beiden Interrupts synchronisieren die zwei Atmega32 für Zeile
und Spalte der code hier ist für Spalte