Ich möchte gerne mittels einem ATMEGA8-16PU jeweils 5 Drehencoder
gleichzeitig abfragen.
Für einen gibt es ja bereits dieses schöne Beispiel hier:
http://www.mikrocontroller.net/articles/Drehgeber
Wie muß ich das ganze jedoch erweitern für 5 Stück?
PeDa Lösung einfach 5-mal hintereinander in ISR.
Bei akuter Speichernot die 2-Bit Status je Encoder packen (4 in ein
Byte).
Oder die 4-fach-parallel-Lösung à la PeDa Entprellung (er)finden.
Aber ein bischen mitdenken ist schon auch erlaubt
Den Teil
1
TCCR0=1<<WGM01^1<<CS01^1<<CS00;
2
OCR0=(uint8_t)(XTAL/64.0*1e-3-0.5);
3
TIMSK|=1<<OCIE0;
brauchst du nicht 5 mal. Einmal den Timer auf den Vorteiler und CTC
Modus einstellen, den Compare Wert setzen und den Interrupt freigeben
reicht völlig aus.
Wenn man schon Code kopiert, sollte man sich zumindest ansehen, was man
da kopiert.
Es wäre auch eine gute Übung för den Schööööler, das Ganze auf eine
mehrkanalige Auswertung mit einem Array zu erweitern, ohne den Code
X-fach zu kopieren. Oder auf Macrobasis. Oder, oder, oder. Copy & Paste
ist bäh.
// positions of encoders for normal use in main loop and functions
34
int16_tencoder_position[ENCODER_COUNT];
35
36
// 1ms timer ISR, sufficient for manual movement
37
38
ISR(TIMER0_COMPA_vect){
39
40
encoder_process(encoder_array,ENCODER_COUNT);
41
}
42
43
intmain(void){
44
45
// init a timer
46
47
TCCR0A=(1<<WGM01);
48
OCR0A=(uint8_t)(F_CPU/64.0*1e-3-0.5);
49
TCCR0B=(1<<CS01|1<<CS00);
50
TIMSK0=(1<<OCIE0A);
51
52
DDRA=0xFF;// init test port, diplay valu with LEDs
53
PORTC=0xFF;// init test port, pull Ups on
54
55
encoder_init(encoder_array,ENCODER_COUNT);
56
sei();
57
58
while(1){
59
encoder_read_all(encoder_array,ENCODER_COUNT,encoder_position);// read all encoders
60
PORTA=encoder_position[0];
61
PORTA=encoder_position[1];
62
}
63
}
Das funktioniert auch soweit.
Allerdings habe ich bei mir die Situation, das ich pro Port
unterschiedliche LED's von mehreren Encoder anzeigen möchte.
Also die ersten 4 PIN's vom ersten Encoder, die nächsten 2 PIN's vom
zweiten Encoder, usw.
Ich muß die Ports also unterteilen.
Wie macht ich das am besten?
>Ich muß die Ports also unterteilen.>Wie macht ich das am besten?
Exakt genau so, wie es dieses Beispiel macht, nur mit dem Unterschied,
dass du Ports schreibst anstatt zu lesen. Siehe Bitmanipulation.