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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.