PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingang abfragen



toetzel
22.10.2006, 22:44
Hallo,
ich versuche gerade meinen mega32 davon zu überzeugen einen Eingang abzufragen, komme dabei aber nicht weiter.

Ich habe Pin A0 als eingang definiert und mit einem Taster versehen welcher auf + landet. Weiter habe ich pin C0 als Ausgang definiert und an - angebunden dazwischen eine LED. Nun habe ich volgendes Programm geschrieben.

Ziel PC0 mit demTaster wieder aus zu schalten.

#include <avr/io.h>
#include <stdint.h>

int main(void)
{
DDRA &= ~( 1 << PA0 ); /* PIN auf Eingang (Taster) */
PORTA |= ( 1 << PA0 ); /* Pullup-Widerstand aktivieren */
DDRC = (1 << DDC0); // pin c0 als ausgang
PORTC |= (1<<PC0); // CPort C0 auf high
if ( !(PINA & (1<<PINA0)) ) // Port A0 = 0 dann mache was
{
PORTC &= ~(1<<PC0); // Port C0 auf low
}
}

PCO geht auf high aber lässt sich nicht mehr über A0 ausschalten. Spannung bei A0 (Taster nicht gedrückt > 0,7*Vcc also =1, Taster gedrückt <0,2*vcc also = 0).

Pascal
22.10.2006, 23:33
Dein Programm enthält keine Endlosschleife. Das Programm wird durchlaufen und am Ende weiß der µC nicht mehr, was er machen soll und macht wohl zumindest nicht mehr das, was er soll. Du musst also noch eine Endlosschleife einbauen, in der du den Eingang ständig abfragst und dann dementsprechend den Ausgang setzt.

Schau dir am besten erst nochmal ein Tutorial zur C-Programmierung eines AVRs an. Gibts z.B. unter www.mikrocontroller.net

Hubert.G
23.10.2006, 12:34
Wie legst du Pin A0 auf 0V wenn der Taster auf +5V geht und der PullUp aktiv ist. Am besten Taster auf GND und PullUp aktiv.

ogni42
23.10.2006, 13:56
Du benötigste - wie schon vorher gepostet - eine Schleife, innerhalb der Dein Taster abgefragt wird, sonst geschieht die Abfrage nur einmal:



#include <avr/io.h>
#include <stdint.h>

int main(void)
{
DDRA &= ~( 1 << PA0 ); /* PIN auf Eingang (Taster) */
PORTA |= ( 1 << PA0 ); /* Pullup-Widerstand aktivieren */
DDRC = (1 << DDC0); // pin c0 als ausgang
PORTC |= (1<<PC0); // CPort C0 auf high
for( ;; )
{
if ( !(PINA & (1<<PINA0)) ) // Port A0 = 0 dann mache was
{
PORTC &= ~(1<<PC0); // Port C0 auf low
}
}

return 0;
}


Wenn jetzt der Taster gedrückt wird, geht PortC.0 auf low. Danach bleibt der Pin auf 0, egal was passiert. Du musst natürlich dafür sorgen, dass PinA.0 bei nicht gedrücktem Taster auf High-Potenzial liegt.

bluelight_electronic
23.10.2006, 18:29
hi,

also hmm ^^ für nen Anfänger ne for(;;) schreiben hmm is gewagt *gg*

*fangen wir mal an*

als minimal programm


#include <avr/io.h>

// deine Headerfiles oder Include files ...

int main(void)

// die Funktion main brauchst immer is ebend main ^^
// void bedeutet grob gesagt nur "nichts"
// das hier wird nur beim Prozessor Start ausgeführt

{

unsigned int variable_uint;

// hier kannst du ja mal die Inizialisierung machen
// z.b. DDR der Ports Setzen und anderes..

while(1)

// while(1) <- das du immer im kreis rennst

{
variable_uint++;

// einfach als Demo variable_uint wird hochgezählt
// hier machst dein Programm das immer im kreis rennen soll

}
}

toetzel
23.10.2006, 21:50
for( ;; )
{
if ( (PINA & (1<<PINA0)) // Port A0 = 0 dann mache was
{
// PORTC &= ~(1<<PC0); // Port C0 auf low
PORTC |= (1<<PC0);
}

das Funzt O:) , habe aber immer noch einen Knoten zwischen den Ohren vermute ich, egal ob ich

if ( (PINA & (1<<PINA0)) // Port A0 = 1 dann mache was
oder if (!( (PINA & (1<<PINA0))) // Port A0 = 0 dann mache was

immer wenn ich auf GND gehe wird die aktion in der Schleife durchgeführt. Wenn ich auf + gehe passiert nichts. Da werde ich noch viel lernen müssen :-k

Danke und Gruß
Tötzel

bluelight_electronic
23.10.2006, 22:20
hehe deine kommentare könnten dich selbst verwirren ^^

= Zuweißung
== Abfrage

;) (nur ma am rande)

dann


if ( (PINA & (1<<PINA0)) // Port A0 = 0 dann mache was

ich glaub dir nicht das das durch deinen Compiler gelaufen ist ^^ da ist def. eine ( zuviel oder eine ) zuwenig ;)

dann du schreibst zwar schön dahinter Port A0 = 0 .. aber frägst auf Port A0 = 1 ab ^^

sollte so heißen


if (!(x & (1<<0)))

also für dein bsp.


if (!(PINA & (1<<PINA0)))

das frägt nun auf 0 ab

und pass immer auf deine Klammersetzung auf .. das gibt dir sons fehler ohne ende und du weißt im ersten mom nicht mal was falsch is da die schelcht auffallen..



mfg

bluelight[/quote]

toetzel
24.10.2006, 18:39
Ich habe zwei Fehler gemacht.

Zum einen Taster auf GND um A0 auf 0 zu setzen ( hätte in E-technik mal besser aufpassen sollen ) :-b Habe da einfach immer gegen VCC gemessen und nicht gegen GND.

Das mit den Klammern stimmt auch, ist durch zu vieles hin und herprobieren gekomen, stimmt läuft so nicht durch den Kompiler. Nun lässt sich meine LED aber ausschalten und ich werde ich mal den analogen Eingängen witmen.

Vielen Dank noch mal

Gruß
Tötzel

Cluni
25.10.2006, 08:58
Mojn,

warum benutzt ihr nicht die schon vorhandenen Makros z.B.:

if (bit_is_clear(PINA,PA0))
...

bzw.
if (bit_is_set(PINA,PA0))
...

EDIT: Die Marcros sind übrigens in der "sfr_defs.h" drin und werden über die "io.h" includet!

Gruß, Bernd

bluelight_electronic
25.10.2006, 17:11
hehe theoretisch hast du recht ja .. aber ich nutz n icc und hab da andere macros (selbst gemachte) da ich ihn auch Beruflich nutz und deshalb gewöhn ich mich halt nicht gern um ;)

darum entweder direkt oder meine macros *g* da ich hier meine macros nicht bringen brauch direkt ;)

Cluni
25.10.2006, 17:22
Ah ja, ok - das ist natürlich ein guter Grund!

Ich finde das dann halt mit mit den Macros wesendlich besser zu lesen - man sieht halt direkt, was Sache ist. Und es ist ja dann eh das Gleiche, was nachher compiliert wird...


Gruß, Bernd

bluelight_electronic
25.10.2006, 17:30
naja was der gcc aus dem code macht ist eh .. *gg*

meine lehrlinge arbeiten halt mit gcc und ich komm dadurch halt auch immer wieder mit in kontakt ..

und das was da raus kommt wenn man nen bit setzt .. *brr* ^^

ogni42
26.10.2006, 14:39
Also der gcc macht bei mir aus:


void setBit()
{
PORTB |= (1<<PB0);
}


Das hier:


setBit:
.LFB2:
.LM1:
/* prologue: frame size=0 */
/* prologue end (size=0) */
.LM2:
sbi 56-0x20,0
/* epilogue: frame size=0 */
ret
/* epilogue end (size=1) */


Was ist denn daran seltsam?

Da wage ich mal zu behaupten, dass der gcc aus dem Code das macht, was man erwartet.