Portansteuerung - richtig (?) formuliert, funktioniert aber nicht

OP #2463298
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
#2463365
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.
Moderator #2463366
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren