Forum: Mikrocontroller und Digitale Elektronik Port erweiterung -- Parallele Ausgabe--avr gcc


von Claudia S. (claudia2)


Angehängte Dateien:

Lesenswert?

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 ;)

von Jean Player (Gast)


Lesenswert?

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.

von Jean Player (Gast)


Lesenswert?

Jean Player schrieb:
> DDRB |= (1<<DDRB);

Sry natürlich DDRB |= (1<<PB3);

N8

von Claudia S. (claudia2)


Lesenswert?

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 !

von Jean Player (Gast)


Lesenswert?

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

von Claudia S. (claudia2)


Lesenswert?

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
Noch kein Account? Hier anmelden.