Forum: Compiler & IDEs Portansteuerung - richtig (?) formuliert, funktioniert aber nicht


von Alexander S. (knut740)


Lesenswert?

Hallo,

ich bin dabei, ein älteres Programm zu überarbeiten und stoße auf ein 
merkwürdiges Verhalten:
1
int main(void)
2
{
3
    DDRA = 0xFF;
4
    while (1)                  
5
   {
6
   PORTA |= (1<<PA0)  | (1<<PA1)  | (1<<PA2);         
7
   _delay_ms(1000);
8
   PORTA &= ~(1<<PA0)  | ~(1<<PA1) | ~(1<<PA2);
9
//  PORTA = 248;
10
   _delay_ms(1000);
11
   };
12
  }

Ich hatte gemeint, so etwas wie PORTA &= ~(1<<PA0) sei die aktuell 
gültige Schreibweise für das Ausschalten eines Ports.
Es schaltet aber nicht aus, nur der Ausdruck   PORTA = 248 hilft!

Was übersehe ich bei meinen Anweisungen?

Gibt es eigentlich ein aktuelles Manual über C für AVR's? Meine letzte 
Version ist die von Schifferle. Leider finde ich hier unter den Artikeln 
und Codesammlungen kaum etwas über die Grundlagen von C und in den 
Buchhandlungen hatte ich nichts über avr-gcc (ich verwende WinAVR) 
gefunden.

Vielen Dank schon mal
Alexander

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Dann schau dir mal

> x &= ~(01)|~(10)

an. Das entspricht

> x &= (10)|(01) => x &= 11

Heißt, es wird sich am Port überhaupt nichts ändern. Was du möchtest ist 
aber
> x &= ~(01|10) => x &= 00

Also:

>PORTA &= ~(1<<PA0 | 1<<PA1 | 1<<PA2);

von Rolf M. (rmagnus)


Lesenswert?

Alternativ kann man die Ersetzung von ODER durch UND, die ganz links 
schon gemacht wurde, konsequent auf den Rest übertragen:

1
    PORTA &= ~(1<<PA0) & ~(1<<PA1) & ~(1<<PA2);

Wenn du die drei Bits einzeln löschen würdest, müßtest du ja auch 
jedesmal ein UND  verwenden:
1
    PORTA &= ~(1<<PA0);
2
    PORTA &= ~(1<<PA1);
3
    PORTA &= ~(1<<PA2);

~(a|b) ist das gleiche wie ~a & ~b.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Alexander Schmeil schrieb:
> Gibt es eigentlich ein aktuelles Manual über C für AVR's?

Das AVR-GCC-Tutorial ist doch recht umfassend. Da steht bspw. auch
die Antwort zu deiner Frage drin:

  http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ver.C3.A4ndern_von_Registerinhalten

> Leider finde ich hier unter den Artikeln und Codesammlungen kaum etwas
> über die Grundlagen von C

Du brauchst im Wesentlichen drei Dinge:

- Eine Anleitung zu C im Allgemeinen, z.B. das Buch von Kernighan und
  Ritchie

- Eine Anleitung mit den Besonderheiten der C-Programmierung auf AVRs,
  bspw. das AVR-GCC-Tutorial

- Eine Anleitung mit den Besonderheiten des jeweils eingesetzten AVR-
  Typs, bspw. das entsprechende Datenblatt von Atmel

Wenn du alle drei durchgelesen und verstanden hast, steht der erfolgrei-
chen AVR-Programmierung nichts mehr im Wege :)

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.