Hey Liebe Elek'er, bin eine "dummy" :D und ich versuche gerade ein absolut Drehgeber mit meinem Atmega88 auszulesen. Habe ein c code beim googlen gefunden und kann schon die werte über Usart auf my pc anzeigen (mit der spi_read methode siehe source code.). jetzt möchte ich aber die daten (uint16_t u16singleturn) paralllel ausgeben am Pin (Port) die übrig sind (PC0...5 , PD3...7,usw...)oder am zwei 74HC595 . Meine Fragen: 1)( Methode Spi_read () siehe source code). wie kann ich zum Bspl. eine uint8_t variable am PC0...5 und PD4,5 ausgeben. (mit MSB am PC0 und LSB am PD5 oder umgekehr) ? DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 <<DDC4)| (1 <<DDC5); //oder DDRC=0x3F; DDRD = (1<<DDD4) | (1<<DDD5) ; und dann ? 2)(Methode pinToggleReadSSI( void )) .für die Ausgabe mit zwei 74*595. ich nehme an RCK liegt am PB3, wie mache ich ein 010 am PB3 um die daten am Latch ausgang zu haben. so?: DDRB = ( 1 << DDB3); PORTB=(1<<PB3); PORTB=~(1<<PB3); PORTB=(1<<PB3); ? 3)(und falls Ihr etwas zeit habt ;) ,würde mich sehr freuen). Für die Ansteuerung via Software hier(http://www.rn-wissen.de/index.php/Portexpander_am_AVR#Ohne_SPI-Hardware) , wie würde dann serpa.c ausehen mit zwei 74*595 (also uint16_t u16data ist auszugeben) und: PC0->SCK PC1->RCK PC2->SER ? Schaltung und Software zum Auslesen des Absolut drehgeber habe ich hier gefunden (pdf): http://www.posital.eu/en/products/POSITAL/AbsoluteEncoders_Context/AbsoluteEncoders_Context_Technology_SSI_AppNote.pdf (bin etwa verwirrt mit dem avr gcc und Portexpander tuto ) danke im voraus ;)
Claudia Sauer schrieb: > Meine Fragen: Bin nicht mehr ganz fit und Code ungetestet, nur im Kopf gedebugged, also ohne Gewähr ;-) > 1)( Methode Spi_read () siehe source code). wie kann ich zum Bspl. > eine uint8_t variable am PC0...5 und PD4,5 ausgeben. (mit MSB am PC0 und > LSB am PD5 oder umgekehr) ? > DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 > <<DDC4)| (1 <<DDC5); //oder DDRC=0x3F; > DDRD = (1<<DDD4) | (1<<DDD5) ; > und dann ? Besser -->
1 | DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1 <<PC5); |
2 | DDRD |= (1<<PD4)|(1<<PD5); |
So überschreibst du nicht die anderen Bits des Registers. LSB an PC0 und PC6 und 7 nicht überschreiben:
1 | PORTC |= (variable & 0x3F); |
2 | PORTD |= ((variable & 0xC0) >> 2); |
MSB an PC0 und .... , allerdings sehr unschön:
1 | unsigned char reverse = 0; |
2 | for(int i = 0; i < 6; i++) |
3 | {
|
4 | reverse += (variable & (0x80 >> i)) >= 1 ? (0x01 << i) : 0x00; |
5 | }
|
6 | PORTC |= reverse; |
7 | unsigned char LSBS |= variable & 0x40 ? 0x10 : 0x00; |
8 | LSBS |= variable & 0x80 ? 0x20 : 0x00; |
> 2)(Methode pinToggleReadSSI( void )) .für die Ausgabe mit zwei 74*595. > ich nehme an RCK liegt am PB3, wie mache ich ein 010 am PB3 um die > daten am Latch ausgang zu haben. so?: > DDRB = ( 1 << DDB3); > PORTB=(1<<PB3); > PORTB=~(1<<PB3); > PORTB=(1<<PB3); Wie oben so überschreibst du nicht andere Bits des Registers. DDRB |= (1<<DDRB); PORTB |= (1<<PB3); PORTB &= ~(1<<PB3); PORTB |= (1<<PB3); > 3)(und falls Ihr etwas zeit habt ;) ,würde mich sehr freuen). Für die > Ansteuerung via Software > hier(http://www.rn-wissen.de/index.php/Portexpander_am_...) Sry das gucke ich mir morgen an, gehe erstmal Bett ! Gruss und viel Erfolg.
Jean Player schrieb: > Jean Player schrieb: >> DDRB |= (1<<DDRB); > > Sry natürlich DDRB |= (1<<PB3); > wow !danke für deine Schnelle Antwort.! > N8 ;) danke u too ! und bis morgen !
Jean Player schrieb: > unsigned char LSBS |= variable & 0x40 ? 0x10 : 0x00; > LSBS |= variable & 0x80 ? 0x20 : 0x00; Oh Gott hier fehlt natürlich auch noch: PORTD |= LSBS; So jetzt aber N8
hey Jean >> 1)( Methode Spi_read () siehe source code). wie kann ich zum Bspl. >> eine uint8_t variable am PC0...5 und PD4,5 ausgeben. (mit MSB am PC0 und >> LSB am PD5 oder umgekehr) ? >> DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 >> <<DDC4)| (1 <<DDC5); //oder DDRC=0x3F; >> DDRD = (1<<DDD4) | (1<<DDD5) ; >> und dann ? > Besser --> >
1 | > DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1 <<PC5); |
2 | > DDRD |= (1<<PD4)|(1<<PD5); |
3 | >
|
> So überschreibst du nicht die anderen Bits des Registers. ok danke ;) 1) > LSB an PC0 und PC6 und 7 nicht überschreiben: >
1 | > PORTC |= (variable & 0x3F); |
2 | > PORTD |= ((variable & 0xC0) >> 2); |
3 | >
|
hmmmm bin etwa vewirrt. wenn ich am Portc 0b11111111 und var =0b00000000 also var& 0x3F =0b00000000 dann bekomme ich am ende Portc= 0b11111111 oder 0b11000000 ? oder Funktioniert das "|=" ? ich habe mir das bei AVR gcc angeschaut und andersrum verstanden also wie ein Portc= Portc "oder"(var&0x3F).... 2) kann man nicht auf einzelne Pin zugreifen zum beispiel PC0 = Var&0b00000001 ? 3) wenn var eine uint16_t ist muss ich die zuweisung wie folgt durchführen ?: PORTC |= uint8_t (var & 0x3F);//bzw. var & 0x0b00111111 PORTD |= uint8_t((var & 0xC0) >> 2);//bzw var&0b11000000 > Gruss und viel Erfolg. Danke !
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.