PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Anfänger! Bitte code angucken



Freakster235
21.02.2008, 15:01
Halllo Leute, ich fange grad bei absolut null an.

Ich hab hier einen kleinen Code:



#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
uint8_t i;

int main(void)
{
DDRC |= (1<<DDC0);
DDRB &= ~(1<<DDB0);
PORTC |= (1<<PORTC0);
while(1) {
if(PINB & ~(1<<PINB0) == 1)
{

PORTC |= (1<<PORTC0);
_delay_ms(1000);

PORTC &= ~(1<<PORTC0);
_delay_ms(1000);

PORTC |= (1<<PORTC0);
_delay_ms(1000);
}
}
return 0;
}


leider macht der nicht was ich will, Irgendwie scheint die IF bedingung nicht zu funktionieren. an PB0 ist ein Taster angeschlossen der von VTG also 5V bei betätigung auf GND geht. Aber die schleife bedingung wird nicht abgearbeitet. Schreibe ich es anders rum das es bei logisch 1 abgearbeitet wird klappt es. Ich hab wohl nen fetten denkfehler drin.
Brauch ich die While schleife eigentlich? Was ist der unterscheid zwischen return 0 und return 1?


Vielen Dank!

zerush
21.02.2008, 15:24
if(PINB & ~(1<<PINB0) == 1)

muss zu:

if(PINB & (1<<PINB0) == 0)

du willst ja nur das erste bit maskieren, du hast genau dieses nicht maskiert ;)
Und == 0, da das ja ausgeführt werden soll, wenn der Button gedrückt wird (also auf GND zieht).

Die while-Schleife ist einfach eine Endlosschleife, damit also immer wieder abgefragt wird, ob der Button gedrückt wurde oder nicht.
Ansonsten würde das Programm einmal durchlaufen und das wars (das ganze ginge so schnell das würdest du gar nicht merken).

return 0 oder return 1 ist hier egal, da dies aufgrund der while-Schleife eh nie erreicht wird...

mfg
zerush

edit:
vielleicht noch zur Erklärung
PINB & (1<<PINB0) macht folgendes:
PINB0 ist nichts anderes als 0, somit ist (1<<0) das gleiche wie 1, oder 0b00000001
wenn du also PINB & 0b00000001 machst, erhälst du 0b0000000x, wobei das x das bit0 von PINB ist...
Ich hoffe das war so verständlich ;)

Freakster235
21.02.2008, 15:32
Hallo,

ich habs wie von dir genannt, aber es klappt leider immer noch nicht. Hab gemessen, also der Pegel fällt auf GND, also die hardwareseite ist 100%ig okay.

if(PINB & (1<<PINB0) == 0)

aber verstehe ich das richtig. die Bedinung PINB ist doch 1 oder? und die Bedingung 1<<PINB0 ist 0 richtig?
Die Tilde (~) sagt negiert aus richtig?

Was macht return 0 und 1 für einen unterschied wenn ich es erreiche?

zerush
21.02.2008, 15:43
Also, das einfache & ist KEINE Verknüpfung von Bedingungen!!! Das wäre &&...
& ist eine bitweise VerUNDung.
Beispiel:
00110011
00011100 &
-----------
00010000

PINB sollte also 00000000 sein, wenn der Button gedrückt wird (der Pin auf GND liegt) und 00000001, wenn er nicht gedrückt ist.

Das &(1<<PINB0) sorgt also nur dafür, dass du alle Bits außer dem relevanten ignorierst.

Die Tilde invertiert dir jeweils die Bits, aus 00010010 wird also 11101101.

return 0 gibt eine 0 zurück, return 1 ne 1..
Das ist völlig egal, da die Main Funktion die oberste Funktion ist und wenn die zuende ist, ist das Programm zu Ende, der Rückgabe Wert interessiert dann nicht mehr ;)

Freakster235
21.02.2008, 16:05
Hallo,

dann müsste dieser Code doch funktionieren:



#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
uint8_t i;

int main(void)
{
DDRC |= (1<<DDC0);
DDRB &= ~(1<<DDB0);
PORTC |= (1<<PORTC0);
while(1) {
if(PINB&(1<<PINB0) == 0)
{

PORTC |= (1<<PORTC0);
_delay_ms(1000);

PORTC &= ~(1<<PORTC0);
_delay_ms(1000);

PORTC |= (1<<PORTC0);
_delay_ms(1000);
}
}
return 0;
}


Tut es aber nicht. Aber umgekehrt schon, also wenn ich die Bedingung ändere das sie durchläuft wenn logisch 1 dann geht solange der taster nicht gedrückt wird, drücke ich den taster stoppt die schleife nach den aktuellen durchlauf bis ich wieder los lasse.

Irgendeine idee?

Ach nochwas. Die gleichung von deiner Bitweisen verknüpfung also WerUNDung. ist die sicher so richtig?

techboy
21.02.2008, 16:56
!?

Probiers mal mit:
High:

if(PINB&(1<<PINB0)) {code...}
Low:

if(!(PINB&(1<<PINB0))) {code...}

Bin zwar schon etwas aus der Übung was AVR Programmieren angeht aber eig. sollte das funktionieren....

Mfg

Freakster235
21.02.2008, 17:03
Hey, genial. So klappt es. Gut dann experementier ich mal weiter.

Danke!

Wiefit biste denn noch auf C? Timer etc. ?

techboy
21.02.2008, 17:10
Jo geht noch so... muss halt ein paar mal was nachlesen... hab schon seit nem jahr oder so kein avr-c mehr geproggt da vergisst man schon vieles... empfehlen kann ich dir das hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR

bzw. wenn es um pwm geht:

http://www.kreatives-chaos.com/artikel/codeschnipsel-avr-gcc

Mfg