mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bits beim Port setzen/löschen


Autor: Michael H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

Ich möchte auf meinem STK500 auf Port-C alle Bits auf einen bestimmten 
Status setzen, also entweder high oder low.

Bei dem Beispiel soll zuerst
PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
 1   0   0   1   1   0   0   1

und nach einer Sekunde:
PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
 1   0   1   0   1   0   1   0

und so weiter. Irgendwie haut das aber nicht hin so wie ich es versucht 
habe:

     PORTC |= (1<<0);
     PORTC &= ~(2<<0);
     PORTC &= ~(4<<0);
     PORTC |= (8<<0);
     PORTC |= (16<<0);
     PORTC &= ~(32<<0);
     PORTC &= ~(64<<0);
     PORTC |= (128<<0);
     _delay_ms(1000);
     PORTC |= (1<<0);
     PORTC &= ~(2<<0);
     PORTC |= (4<<0);
     PORTC &= ~(8<<0);
     PORTC |= (16<<0);
     PORTC &= ~(32<<0);
     PORTC |= (64<<0);
     PORTC &= ~(128<<0);
     _delay_ms(1000);

Wie kann ich das umsetzen, so daß bestimmt Ports gesetzt sind und andere 
gelöscht, ohne unsichere Zustände zu haben?

Gruß
Michael

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

Bewertung
0 lesenswert
nicht lesenswert

Autor: M.Heuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde das so funktionieren? (Ich habe mein STK500 im Moment nicht am 
Mann)

>Bei dem Beispiel soll zuerst
>PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
> 1   0   0   1   1   0   0   1
>
>und nach einer Sekunde:
>PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
> 1   0   1   0   1   0   1   0


PORTC |= ((1 << PC0) | (1 << PC3) | (1 << PC4) | (1 << PC7));
PORTC &= ~((1 << PC1) | (1 << PC2) | (1 << PC5) | (1 << PC6));
_delay_ms(1000);

PORTC |= ((1 << PC0) | (1 << PC2) | (1 << PC4) | (1 << PC6));
PORTC &= ~((1 << PC1) | (1 << PC3) | (1 << PC5) | (1 << PC7));
_delay_ms(1000);



gruß
Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du eh jeweils alle Bits im Register manipulieren willst, dann 
kannste Dir den Kram mit den UND und ODER sparen und einfach das 
Bitmuster reinschreiben!
PORTC |= ((1 << PC0) | (1 << PC3) | (1 << PC4) | (1 << PC7));
PORTC &= ~((1 << PC1) | (1 << PC2) | (1 << PC5) | (1 << PC6));
//...ist identisch mit
PORTC = 0x99;

//und
PORTC |= ((1 << PC0) | (1 << PC2) | (1 << PC4) | (1 << PC6));
PORTC &= ~((1 << PC1) | (1 << PC3) | (1 << PC5) | (1 << PC7));
//...mit
PORTC = 0x77;
Die bitweisen logischen Verknüpfungen werden nur benötigt, wenn nicht 
alle Bits verändert werden sollen.

Übrigens schreibt man Zahlen i.d.R. mit der höchstwertigen Stelle links 
und der niedrigstwertigen rechts. Oder schreibst Du 
tausendzweihundertvierunddreißig als 4321?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> PORTC = 0x77;

Ähm, doch wohl eher 0x55.

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

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
> Johannes M. wrote:
>
>> PORTC = 0x77;
>
> Ähm, doch wohl eher 0x55.
Jüpp, hast recht. Seine "arabische Schreibweise" hat mich doch ein 
bisschen verwirrt...

Autor: Michael H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke und Salamaleikum :)

Gruß
Michael

Autor: M.Heuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie will er nicht wie er soll. Ich dachte ich hätte die Sache mit 
der Zuweisung als Hexzahl verstanden, aber die LEDs am STK500 richten 
sich nicht danach:

"soll" ist der als Hex übergebene Wert, "ist" ist der wie ihn die LEDs 
anzeigen:

                PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0  HEX
1.Schritt soll   1   0   0   1   1   0   0   1   0x99
          ist    0   1   0   0   0   0   1   0   0x42

2.Schritt soll   0   1   0   1   0   1   0   1   0x55
          ist    1   0   0   0   0   0   1   0   0x82

3.Schritt soll   0   1   1   0   0   1   1   0   0x66
          ist    1   0   0   0   0   0   0   1   0x81

4.Schritt soll   1   0   1   0   1   0   1   0   0xaa
          ist    0   1   0   0   0   0   0   1   0x41

Ich habe das Programm mal auf das wesentliche eingedampft:
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 3686400

int main(void){
 DDRC  = 0xff;  //alle auf Ausgang stellen

 while(1){            //        PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
     PORTC = 0x99;    //  soll   1   0   0   1   1   0   0   1
                      //  ist    0   1   0   0   0   0   1   0
     _delay_ms(1000);
     PORTC = 0x55;    //  soll   0   1   0   1   0   1   0   1
                      //  ist    1   0   0   0   0   0   1   0
     _delay_ms(1000);
     PORTC = 0x66;    //  soll   0   1   1   0   0   1   1   0
                      //  ist    1   0   0   0   0   0   0   1
     _delay_ms(1000);
     PORTC = 0xaa;    //  soll   1   0   1   0   1   0   1   0
                      //  ist    0   1   0   0   0   0   0   1
     _delay_ms(1000);
 }
}

Ich sehe einfach nicht wo da der Wurm drin ist.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Welchen Controller benutzt du? (hat der vielleicht ein 
JTAG-Interface?)
2. Die LEDs am STK500 funktionieren invertiert, was soviel heisst, dass 
sie leuchten, wenn man eine 0 an den Port schreibt.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.Heuer wrote:
> (soll/ist Tabelle)

PC2-5 sind immer 0
-> JTAG ist aktiviert

Rest ist invertiert
-> die LEDs sind gegen VCC angeschlossen und werden daher von dir falsch 
interpretiert (leuchten bei 0)

Autor: M.Heuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo STK500-Besitzer und Stefan

Das wars wohl gewesen.
Ich habe das JTAG mit den Zeilen aus dem Tutorial deaktiviert...
   MCUCSR |= (1<<JTD);
   MCUCSR |= (1<<JTD);
...allerdings weis ich nicht so recht was ich da eigentlich gemacht 
habe. Ich werde mir das noch mal genauer im Tutorial zu Gemüte führen 
müssen.

Danke und Gruß
Michael

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTC = 0x99;    //  soll   1   0   0   1   1   0   0   1
kann man auch als
PORTC = 0b10011001;    //  soll   1   0   0   1   1   0   0   1
schreiben. Das ist für Bitmuster vielleicht eingängiger.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PORTC = 0b10011001;    //  soll   1   0   0   1   1   0   0   1
>schreiben. Das ist für Bitmuster vielleicht eingängiger.
aber nicht standardconform

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  _delay_ms(1000);

Das ist so nicht machbar; guck mal im AVR-GCC-Tutorial unter delays 
nach.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sir alan Teplotaxl wrote:
>>>  _delay_ms(1000);
>
> Das ist so nicht machbar; guck mal im AVR-GCC-Tutorial unter delays
> nach.

Hängt davon ab, welche Version der avr-libc er benutzt.

Autor: M.Heuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sir alan Teplotaxl
>>>  _delay_ms(1000);
>Das ist so nicht machbar; guck mal im AVR-GCC-Tutorial unter delays
>nach.
Ist nur dafür das ich sehen kann was an den LED's passiert. Wird jetzt, 
wo tatsächlich passiert was passieren soll, runtergesetzt :-)


@Stefan Ernst
>>>>  _delay_ms(1000);
>>
>> Das ist so nicht machbar; guck mal im AVR-GCC-Tutorial unter delays
>> nach.
>
>Hängt davon ab, welche Version der avr-libc er benutzt.

Laut Synaptic ist es Version 1.4.7-1 (Ich benutzer hier Ubuntu (Hardy), 
avrdude 5.5.1, gcc-avr 4.2.2-1)

Gruß
Michael

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.