PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMEGA32 avr-g++ kann keine Ausgänge setzen



TDK
26.02.2010, 12:35
Hi Leute

Ich hab ein Problem:
Wenn i versuche zwei Ausgänge nacheinander zu setzen, wird immer nur der erste gesetzt. Beim zweiten Versuch kann ich dann keine Ausgänge mehr auf high (oder low bei active-low) setzen.

Hier mein Code:


#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

int main()
{
DDRC |= 0xFF;
PINC |= (1<<0); //Wird gesetzt
waitms(1000);
PINC |= (1<<1); //Wird nicht mehr gesetzt
waitms(1000);
PINC |= (1<<0); //wird auch nicht gesetzt
waitms(1000);
PINC |= (1<<1); //und das auch nicht

}


Ich hoffe ihr könnt mir Helfen!
Brauch das für ein Miniprojekt in der Schule :(

MFG

oberallgeier
26.02.2010, 12:48
... Wenn i versuche zwei Ausgänge nacheinander zu setzen, wird immer nur der erste gesetzt ...PINC ist für die Statusabfrage des Portpins. Wenn Du einen bestimmten Pin setzen willst, musst Du PORTC schreiben. Übrigens werden bei Dir die L EDs nacheinander, eine nach der anderen gesetzt - das ist Dir schon klar ! ? Zum Schluss sind alle an.

Die Befehle können so lauten:

// PORTC |= (1<<PC4); // Port PC4 PC4 einschalten
// PORTC &= ~(1<<PC4); // Port PC4 ausschalten
// PORTC ^= (1<<PC4); // Port PC4 toggeln

TDK
26.02.2010, 12:55
Ach, ich habe vergessen das mit PINC zu ändern :)
Hab vorher PORTC drin gehabt, hat aber auch nicht funktioniert.
In einem Tut im net hab ich folgende Befehle gefunden:


PORTC |= (0<<0) //Pin0 von PORTC auf high setzen (active-low)
PORTC |= (1<<0) ////Pin0 von PORTC auf low setzen
den Befehl

PORTC &= ~(1<<PC4);
hab ich noch nie gesehen; wer ich ausprobieren, danke für deine Hilfe :)

MFG
TDK

Ceos
26.02.2010, 13:19
öhm naja du solltest dir vielleicht die bitoperationen nocheinmal genau ansehen


PORTC |= (1<<0);
// ausführlich
PORTC = PORTC | (00000001 << 0);
PORTC = xxxxxxxx | 00000001; //sinngemäß
PORTC = xxxxxxx1;
// wenn du jetzt aber
PORTC |= (0<<0); //schreibst, passiert NICHTS denn

PORTC = PORTC | (00000000 << 0);
PORTC = xxxxxxxx | 00000000;
// 0 ODER 1 ergibt 1 und 1 ODER 1 ergibt 1 ... ausschliesslich 0 ODER 0 ergibt auch 0

// was du brauchst ist das logische UND
// 1 UND 1 ergibt 1 ... 1 UND 0 ergibt 0 und 0 UND 0 ergibt 0

//nun musst du nur darauf achten, dass ALLE anderen bits 1 sind bis auf das/die bit(s) welche(s) du löschen möchtest

PORTC = xxxxxxxx & 01111111; //sinngemäß
PORTC = xxxxxxxx & ~(10000000); //mit negierung
// das ~ zeichen kehrt alle bits einmal um

//in kurzform wäre dass dann
PORTC &= ~(1<<1);

// die schreibweise mit PCn (PC4 im code oben) ist ein makro der atmel lib, PC4 heisst nichts anderes als PIN 4 an PORT C, aufgelöst steht in dem makro also nur eine 4

(1<<PC4) == (1<<4)