www.mikrocontroller.net

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


Autor: Claudia Sauer (claudia2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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_...) 
,

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/Absolute...
(bin etwa verwirrt mit dem avr gcc und Portexpander tuto )

danke im voraus ;)

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 -->
DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1 <<PC5);
DDRD |= (1<<PD4)|(1<<PD5);
So überschreibst du nicht die anderen Bits des Registers.

LSB an PC0 und PC6 und 7 nicht überschreiben:
PORTC |= (variable & 0x3F);
PORTD |= ((variable & 0xC0) >> 2);

MSB an PC0 und .... , allerdings sehr unschön:
unsigned char reverse = 0;
for(int i = 0; i < 6; i++)
{
   reverse += (variable & (0x80 >> i)) >= 1 ? (0x01 << i) : 0x00;
}
PORTC |= reverse;
unsigned char LSBS |= variable & 0x40 ? 0x10 : 0x00;
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.

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jean Player schrieb:
> DDRB |= (1<<DDRB);

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

N8

Autor: Claudia Sauer (claudia2)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Claudia Sauer (claudia2)
Datum:

Bewertung
0 lesenswert
nicht 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 -->
>
> DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1 <<PC5);
> DDRD |= (1<<PD4)|(1<<PD5);
> 
> So überschreibst du nicht die anderen Bits des Registers.
ok danke ;)

1)
> LSB an PC0 und PC6 und 7 nicht überschreiben:
>
> PORTC |= (variable & 0x3F);
> PORTD |= ((variable & 0xC0) >> 2);
> 
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 !

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.