Squant
A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."
Even verhaal vooraf.
Ik heb dus een robot met daaraan motors etc, ik gebruik nu zelfgemaakte stappen encoders zodat ik kan zien hoeveel omwentelingen een wiel heeft afgelegd.
Om dit te detecteren heb ik een uit een hele oude muis IR LED (eigenlijk niet meer echt light emitting maar goed) en foto diodes uit gehaald.
Nou eerst een encoder wiel gemaakt met behulp van lego en aan de scoop gehangen om te kijken of het geheel werkt. Nou ik zie iedere keer wanneer een opening dat de spanning valt. (hij werkt dus)
De IR ontvang diode is aangesloten met een weerstand van 100k aan de +5 en de andere poot op de grond. Tussen de weerstand en diode heb ik een input pin van de AVR aangesloten (PD2 voor linker motor en PD3 voor rechter motor), maar nu het probleem. Ik zie de niveau verschillen op me scope wanneer het wiel draait. Maar ik merk geen verschil aan de pinnen van de AVR.
Ik weet al wel wat van de AVR, maar niet echt veel met betrekking tot de IO poorten, deze zijn behoorlijk anders dan die van een 8051.
Hier heb ik een stukkie code, let niet op de andere functies maar op de PortD gerelateerde dingen.
/* Main - a simple test program*/
int main( void )
{
int loop=0,cyclecnt=0;
int portvalue=0;
uart_Init( 47 ); /* Set the baudrate to 19,200 bps using a 14.7456 crystal */
pwm_init();
set_pwm2(255);
set_pwm0(255);
DDRD = 0x00;
PORTD = 0x00;
FILE *comport = fdevopen(uart_putc,uart_getc,0); // open comport
printf("\n\r");
for(;;) /* Forever */
{
portvalue = PORTD;
printf("test:. %4de keer getal %6x port D %x \r",cyclecnt,loop,portvalue);
scanf("%d",&loop);
set_pwm2(cyclecnt);
set_pwm0(cyclecnt);
cyclecnt++;
if(cyclecnt == 255) {
cyclecnt = 0;
}
}
return 0;
fclose(comport);
}
Even korte uitleg, de PWM poorten sturen de motortjes waar de coderings wielen aan vast zitten. In lus wordt constant de portD uitgelezen, en zou er een wijziging in de niveaus van de portD (portvalue) plaats vinden, dat is dus niet het geval. Ik kan dit wel bevestigen met me scope, waarom doet ie het dan niet?
Iemand een idee?
Of kan iemand mij gewoon een voorbeeld stukje code geven waarbij hij weet dat hij met een poort de niveaus kan lezen?
Squant
A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."
Okay... zeer stomme fout aan mij kant, ben weer teveel de 8051 gewend. Met portD kun je niet de toestand van de poort uitlezen dat doe je met PIND... Had beter de datasheet moeten doorkijken.
Slotje alsjeblief