KR-500
26.07.2011, 14:47
Hallo zusammen,
hier beschreibe ich wie versprochen (hat etwas länger gedauert aber hab jetzt endlich Ferien *freu*) wie ich das Click Wheel an den AVR angeschlossen habe. Als erstes hier zwei Bilder:
19443 19444
Wie auf dem ersten Bild schon zu sehen ist, ist der Connector leider in SMD, ich habe einfach an jede Kupferbahn ein Stückchen Kufperdraht angelötet (eine Faser aus einer Kupferlitze), das hat mit meinem Lötkolben mässig gut geklappt, aber nach zwei Versuchen hat es dann alles Funtkionert. Ich habe immer ein Stückkupferdraht nach vorne und eins nach hinten angelötet und dann zum schluss in eine Richtung gebogen. Eleganter wäre es wahrscheinliche einen SMD connector zu verwenden :).
Das Wheel funktioniert mit 3,3 Volt und die Pinbelgung ist wie folgt:
1 - VCC
2 - Clock vom Click Wheel
3 - muss mit VCC verbunden sein
4 - nicht angeschlossen
5 - nicht angeschlossen
6 - muss mit VCC verbunden sein
7 - Daten vom Click Wheel
8 - GND
Der erste Pin ist im Bild rot markiert und die Leiterbahn ist etwas dicker als alle anderen.
So weit zur Hardware, als nächstes habe ich mir einen kleinen Logic Analyser gebaut um mir das Protokoll an zu gucken. Hier noch einmal ein Bild von dem Signal:
19445 Im Anhang ist auch noch mal ein Zip-File mit dem C-Prog und der Excel Tabelle. Die Daten habe ich von dem AVR mit HTerm empfangen und dann als Output gespeichert.
Kommen wir nun zum eigentlichen Programm, dass das Signal auswertet. Wie hier https://www.roboternetz.de/community/showthread.php?53933-Funkwecker-R8C-13-GLCD-SD-Card-ClickWheel-Musik-ausgabe schon geschrieben, sendet das Click Wheel immer 4 Byte an den µc, davon sind erstes und letztes immer gleich. Im zweiten steht die Position des Fingers und im dritten ob ein Button gedrückt oder losgelassen wurde.
Das auswerten ist eigentlich recht einfach, da man immer bei der steigenden Flanke auf der Clock Leitung die Daten Leitung einlesen kann. Man muss also lediglich einen Externen Interrupt auf steigende Flanke stellen und dann in der Interrupt Routine die Daten einlesen. Im Code sieht das in etwa so aus:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "USART_Util.h"
volatile unsigned long data;
volatile int counter = 0;
int main (void){
USART_Init(USART_BAUD_SELECT);
USART_String("Hello World");
MCUCR |= (1<<ISC01) | (1<<ISC00); // steigende Flanke
GICR |= (1<<INT0); // Ext. Interrupt aktivieren
DDRD = 0x00; // PORTD auf Eingang
PORTD |= 0xFF; // Pullups aktivieren
sei(); // Globale Interrupts aktivieren
while(1){
}
return 0;
}
ISR( INT0_vect ) {
if(PIND & 0b00001000){
data |= 0x80000000; // eine Eins Speichern
}
data >>= 1; // weiter schieben
counter++; // Counter addieren
if(counter == 32){
USART_Transmit((data&0xFF000000)>>24);
USART_Transmit((data&0x00FF0000)>>16);
USART_Transmit((data&0x0000FF00)>>8);
USART_Transmit(data&0x000000FF);
USART_Transmit('\r');
USART_Transmit('\n');
counter=0;
data = 0;
}
}
Konnte den Code jetzt Leider nicht mehr Testen und weiß nicht genau ob zu 100% klappt, weil ich den Code anfangs für den R8C/13 geschrieben hab. Wenn es Verbesserungen gibt, immer her damit :).
(http://shop.ebay.de/i.html?_from=R40&_trksid=p5197.m570.l1313&_nkw=click+wheel&_sacat=See-All-Categories) <- Da hab ich meins auch her.
KR-500
hier beschreibe ich wie versprochen (hat etwas länger gedauert aber hab jetzt endlich Ferien *freu*) wie ich das Click Wheel an den AVR angeschlossen habe. Als erstes hier zwei Bilder:
19443 19444
Wie auf dem ersten Bild schon zu sehen ist, ist der Connector leider in SMD, ich habe einfach an jede Kupferbahn ein Stückchen Kufperdraht angelötet (eine Faser aus einer Kupferlitze), das hat mit meinem Lötkolben mässig gut geklappt, aber nach zwei Versuchen hat es dann alles Funtkionert. Ich habe immer ein Stückkupferdraht nach vorne und eins nach hinten angelötet und dann zum schluss in eine Richtung gebogen. Eleganter wäre es wahrscheinliche einen SMD connector zu verwenden :).
Das Wheel funktioniert mit 3,3 Volt und die Pinbelgung ist wie folgt:
1 - VCC
2 - Clock vom Click Wheel
3 - muss mit VCC verbunden sein
4 - nicht angeschlossen
5 - nicht angeschlossen
6 - muss mit VCC verbunden sein
7 - Daten vom Click Wheel
8 - GND
Der erste Pin ist im Bild rot markiert und die Leiterbahn ist etwas dicker als alle anderen.
So weit zur Hardware, als nächstes habe ich mir einen kleinen Logic Analyser gebaut um mir das Protokoll an zu gucken. Hier noch einmal ein Bild von dem Signal:
19445 Im Anhang ist auch noch mal ein Zip-File mit dem C-Prog und der Excel Tabelle. Die Daten habe ich von dem AVR mit HTerm empfangen und dann als Output gespeichert.
Kommen wir nun zum eigentlichen Programm, dass das Signal auswertet. Wie hier https://www.roboternetz.de/community/showthread.php?53933-Funkwecker-R8C-13-GLCD-SD-Card-ClickWheel-Musik-ausgabe schon geschrieben, sendet das Click Wheel immer 4 Byte an den µc, davon sind erstes und letztes immer gleich. Im zweiten steht die Position des Fingers und im dritten ob ein Button gedrückt oder losgelassen wurde.
Das auswerten ist eigentlich recht einfach, da man immer bei der steigenden Flanke auf der Clock Leitung die Daten Leitung einlesen kann. Man muss also lediglich einen Externen Interrupt auf steigende Flanke stellen und dann in der Interrupt Routine die Daten einlesen. Im Code sieht das in etwa so aus:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "USART_Util.h"
volatile unsigned long data;
volatile int counter = 0;
int main (void){
USART_Init(USART_BAUD_SELECT);
USART_String("Hello World");
MCUCR |= (1<<ISC01) | (1<<ISC00); // steigende Flanke
GICR |= (1<<INT0); // Ext. Interrupt aktivieren
DDRD = 0x00; // PORTD auf Eingang
PORTD |= 0xFF; // Pullups aktivieren
sei(); // Globale Interrupts aktivieren
while(1){
}
return 0;
}
ISR( INT0_vect ) {
if(PIND & 0b00001000){
data |= 0x80000000; // eine Eins Speichern
}
data >>= 1; // weiter schieben
counter++; // Counter addieren
if(counter == 32){
USART_Transmit((data&0xFF000000)>>24);
USART_Transmit((data&0x00FF0000)>>16);
USART_Transmit((data&0x0000FF00)>>8);
USART_Transmit(data&0x000000FF);
USART_Transmit('\r');
USART_Transmit('\n');
counter=0;
data = 0;
}
}
Konnte den Code jetzt Leider nicht mehr Testen und weiß nicht genau ob zu 100% klappt, weil ich den Code anfangs für den R8C/13 geschrieben hab. Wenn es Verbesserungen gibt, immer her damit :).
(http://shop.ebay.de/i.html?_from=R40&_trksid=p5197.m570.l1313&_nkw=click+wheel&_sacat=See-All-Categories) <- Da hab ich meins auch her.
KR-500