mikrocontroller.net

Forum: Compiler & IDEs Pin entsprechend eines Bits aus char setzen


Autor: Dirk S. (fusebit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Leute,

ich stehe hier auf dem Schlauch. Ich habe ein Konfigurations char der 
innerhalb einer for-Schleife an einen ADC übergeben werden soll.

Ich habe also z.B.: 01100110

Dann möchte ich im ersten Durchlauf den entsprechenden Portpin auf Null 
setzten, im zweiten und dritten auf eins usw...

Nur wie picke ich mir die Werte raus?

Den umgekehrten Fall, einen Wert von einem Pin in einen char schieben 
habe ich kapiert, nur andersherum verstehe ich es nicht :-(


Vielen Dank schonmal

Dirk

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht willst du ja Hardware-SPI nehmen?

In Software ungefähr so:
uint8_t
talk(uint8_t what)
{
   uint8_t i, res;

   for (i = res = 0; i < 8; i++) {
      res >>= 1;
      if (what & 0x80)
         PORTA |= 1;
      else
         PORTA &= ~1;
      /* clock pulse */
      PORTA |= 2;
      PORTA &= ~2;
      asm("nop");
      if (PINA & 4)
         res |= 0x80;
      what <<= 1;
   }

   return res;

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir mal SPI angeschaut?
int8_t i;
for( i = 0; i<8; i++){
    if (data & 0x01) /* 0x80, wenn das Höchste Bit (MSB) zuerst gesendet werden soll */
        SETPIN;
    else
        CLEARPIN;
    /* hier muss bestimmt ein Taktsignal erzeugt werden, also ein Art 
 _delay() */
    
   data >>= data; // "<<=" wenn das MSB zuerst gesendet wird
   //wieder Taktsignal
}
//SETPIN, CLEARPIN sehen ungefähr so aus
#define SETPIN PORTN |= (1<<PN)
mach dir noch Gedanken:
 - welchen Pegel haben die Leitungen, wenn nicht gesendet wird
 - wann kommt das Taktsignal, d.h. die Flanken (kein Taktsignal haben im 
µC-Bereich eigentlich nur 1Wire oder UART-Signal)
 - muss die Datenleitung zwischen In/Output umgeschaltet werden (falls 
es nur eine gibt)
 - in welcher Reihenfolge werden mehrere Bytes gesendet
 - Kannst du nicht vielleicht eingebaute Hardware (SPI, TWI, USART) oder 
fertigen Code benutzen (Hier im Codesammlung -Forum)

hth. Jörg

Autor: Dirk S. (fusebit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar könnte man Hardware SPI nehmen, aber dann kapiere ich das ja nie. 
Ich möchte das einmal zu Fuß machen, danach kann ich ja das Auto 
nehmen...

Vielen Dank für die Tipps, werde sie mal versuche zu verstehen. Habe 
aber auch schon selber weiter geschaut. Könnte das funktioneren?
  for(int i=0;i<8;i++)
  {
    SETBIT(PORTB,3);            //SLK auf 1
    
    if((flag & (1<<i) !=0)) SETBIT(PORTB,2);
    else CLRBIT(PORTB,2);
    
    asm volatile ("nop");
//    wert=(wert<<1);
//    asm volatile ("nop");
//    if (bit_is_set(PIND,6)) wert|=1;    //DATA abfragen
    CLRBIT(PORTB,3);            //SCK auf 0
  }

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn in "flag" das auszugebende Byte steht, dann dürfte das klappen.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1<<i
ist auf dem AVR evtl. nicht so günstig, der kann nur 1 oder 4 Bits auf 
einmal schieben, also auf jeden Fall das List-File anschauen

> if(flag & (1<<i) !=0)
finde ich sehr hässlich -- if(flag &...) tut exakt das gleiche (aber 
meine persönliche Meinung)

und am Ende musst du nach dem
> CLRBIT(PORTB,3);            //SCK auf 0

wahrscheinlich noch mal warten (Nop/delay..)

hth. Jörg

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schreibe ein Byte seriell über einen Portpin auf eine 3 Leitungs 
Chipkarte SLE4442 so:
void writedata(uint8_t wert) {
  uint8_t i;
  for(i=0; i<8; i++) {
    if (wert & 0x01) io1; else io0;
    puls();
    wert = (wert>>1);
  }
}

  

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.