Hallo
Aha, laut Datenblatt des Tiny2313 (Seite 181 ganz unten) hat der interen PullUp zwischen 20k und 50k, für den Geber werden aber 10k vorgeschlagen. Bei zu großem PullUp würde möglicherweise der High-Pegel am AVR-Eingang nicht sicher erreicht werden. Das würde ich zuerst versuchen.
Dann steht im Geberdatenblatt noch das:
Logic Rise and Fall: less than 30 ms
...
Contact Bounce: less than 4 ms at make
and less than 10 ms at break
Ich bin jetzt nicht so der TTL-Profi, aber ich habe das Gefühl, wir sind viel zu schnell mit unserer Abfrage! Der Tiny2313 läuft defaultmässig (mit /8-Prescaler an internen 8MHZ) mit 1MHz (Datenblatt S.25 "Default Clock Source"), ein NOP würde dann 1 µs verzögern. Bei Signalflanken kleiner 30ms wären das fast 30000 AVR-Takte? Warum ändert sich da was wenn wir count=4 verändern? Was ändert dein Clock/8-Fuse bei dem der Tiny dann eigentlich mit 8MHZ rennen sollte? Ich hätte erwartet, dass ein optischer Sensor viel schneller reagiert *grübel* (Dieser Ansatz ist vielleicht auch eine Sackgasse)
Die 32 Rastungen(=Schritte?) pro Umdrehung kann ich auch nirgends finden. Sind es vielleicht nur 16? Das steht in der Teilenummer verschlüsselt. Bei 16 Impulsen pro Umdrehung würden die Dimensionen stimmen:
MaxSpeed: 100RPM
MinRiseandFall: 0,030s
60Sek/(16Imp/Umdr * 100)=60/1600=0,0375s
Das würde bedeuten, der Pegel bleibt mindestens 0,0075 Sekunden konstant? Lange Rede, kurzer Sinn: Du drehst einfach zu schnell 
Wenn die kleineren PullUps nicht helfen sollten wir mal die Bitlängen des Gebers bei schnellem Drehen messen:
Code:
#define AVRGCC
#include <avr/io.h>
/**
PD2 Eingang Spur A
PD3 Eingang Spur B
PB0 Ausgang links
PB1 Ausgang rechts
**/
#define Links1 PORTB = (PORTB | (1<<PB0))
#define Links0 PORTB = ~(~PORTB | (1<<PB0))
#define Rechts1 PORTB = (PORTB | (1<<PB1))
#define Rechts0 PORTB = ~(~PORTB | (1<<PB1))
#define SpurA ((PIND & 0b00000100) == 0)
#define SpurB ((PIND & 0b00001000) == 0)
char SpurA_akt, SpurA_old, SpurB_akt, SpurB_old, count = 0, dir = 0;
unsigned int count16;
int main(void)
{
DDRB = 0b00000011;
PORTB = 0b00000011;
DDRD = 0b00000000;
PORTD = 0b00001100;
while (1)
{
count16=0; // vorsichtshalber 16Bit-Zähler bereitstellen
count=5; // Dummywechsel (sollte ungerade sein)
while(!SpurA); // warten auf Startpegel
SpurA_old=SpurA; // das merken wir uns
while(count--) // Dummyspurwechsel um volle Drehgeschwindigkeit zu erreichen
{
while(SpurA==SpurA_old);
SpurA_old=SpurA;
}
// jetzt sollte der selbe Pegel wie beim Start gemessen werden
while(SpurA==SpurA_old) count16++;
// und nun steht in count16 die Zähllänge des Spurwechsels
}
return(0);
}
Keine Ahnung ob das so funktioniert.
Gruß
mic
Lesezeichen