Autor |
LED auf Knopfdruck leuchten lassen in C Suche nach: led (32524) |
|
|
|
|
BID = 870147
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
|
Hallo,
ich werde hier noch wahnsinnig. Ich habe das PICKit2 mit dem Low Pin Count demo Board. Ich programmiere in C mit MPLAB auf dem PIC16F690
Ich möchte ledeglich die LEDs leuchten lassen, wenn ich den Taster drücke. Hier mal mein Programm:
void main ()
{
TRISC = 0; //Port C als Ausgang
TRISA3 = 1; //RA3 als Eingang (Taster)
int i= 0;
if (RA3)
{
for(i=0; i<1;i++);
PORTC = 0b1111111;
}
else
{
PORTC = 0b0000000;
}
was mache ich falsch?
|
|
BID = 870150
Offroad GTI Urgestein
Beiträge: 12710 Wohnort: Cottbus
|
|
Was hat denn die Schleife da drin verloren?
Die Definition i<1 ist auch nicht gerade sinnvoll, da dies für i=0 (also die Anfangsbedingung) immer wahr ist, und die Schleife damit sofort wieder beendet wird.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber. |
|
BID = 870233
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
Danke für deine schnelle Antwort, hab das Programm geändert, funktioniert aber immer noch nicht.
void main ()
{
TRISC = 0;
TRISA3 = 1;
if (RA3)
{
PORTC = 0b1111111;
}
else
{
PORTC = 0b0000000;
}
}
|
BID = 870237
Offroad GTI Urgestein
Beiträge: 12710 Wohnort: Cottbus
|
DonComi hat mir auch schon mal bei diesem Problem geholfen, das Ergebnis sah da dann so aus (ist allerdings für einen ATtiny):
Code : |
#include <avr/io.h>
#define S1 (PINB&(1<<PINB3))
#define LED1 PORTB, PORTB7
#define setbit(IO) __setbit(IO)
#define __setbit(PORT, BIT) PORT |= (1<<BIT)
#define clearbit(IO) __clearbit(IO)
#define __clearbit(PORT, BIT) PORT &=~ (1<<BIT)
int main (void)
{
DDRB = 0xFF; //PortB Ausgang
PORTB = 0x00; //Alle PullUp-Widerstände aus
do
{
if(S1) setbit(LED1);
else clearbit(LED1);
}while(1);
return 1;
} |
|
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 870380
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Code : |
if (RA3)
{
PORTC = 0b1111111;
}
else
{
PORTC = 0b0000000;
} |
|
Wie soll das mit diesem Code denn überhaupt funktionieren??
Der Code muss zyklisch immer Folgendes tun: Er muss abfragen, ob der Taster gedrückt ist, und wenn ja, dann schaltet er halt die LED an, sonst nicht; Pseudocode
while(1)
{
if(TASTERPORT & (1<<TASTENBIT))
{
LEDPORT |= 1<<LEDBIT;
}
else
{
LEDPORT &= ~(1<<LEDBIT);
}
}
Dabei gehe ich davon aus, dass der Taster den entsprechenden IO-Pin auf 1 setzt, wenn der gedrückt wird und die LED mit einer 1 angeschaltet wird.
"Richtiges" C kennt übrigens keine Binärzahlen (0b11101111 oder so) nicht!
Sowas macht man auch nicht! Programmierer denken hexadezimal, und dort sieht man z.B. auch sofort, welche Bits gesetzt sind und welche nicht.
Da ich mich mit PICs nicht auskenne nur soviel.
Ob du die Hardware überhaupt richtig anspricht, kann ich daher nicht sagen.
_________________
|
BID = 870412
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| TRISA3 = 1; //RA3 als Eingang (Taster) |
Was hängt denn da hardwaremäßig dran?
Vielleicht ändert sich der Zustand des Pins überhaupt nicht, wenn du den Taster betätigst.
Dabei auch berücksichtigen, ob die eingebauten Pull-up-Widerstände ein- oder ausgeschaltet sind.
P.S.:
Zitat :
| was mache ich falsch? |
Die Frage ist falsch gestellt, sondern sie müsste lauten "was mache ich (oder der Prozessor) danach?"
In der Praxis schmiert er vermutlich ab, d.h. er rast durch den Speicher in welchem anstatt eines sinnvollen Programmcodes irgend ein binärer Müll steht und schliesslich hängt er irgendwo in einer Endlosschleife fest.
Wie es richtig geht, hat DonComi ja bereits geschrieben.
[ Diese Nachricht wurde geändert von: perl am 26 Jan 2013 18:52 ]
|
BID = 870571
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
Also inzwischen schaut mein Programm wie so aus:
void main ()
{
TRISC = 0;
ANSEL =0;
while (1)
if (RA3)
{
PORTC = 0b1111111;
}
else
{
PORTC = 0b0000000;
}
}
Funktioniert aber immer noch nicht.
Hier ist das Datenblatt meiner Platine, auf Seite 12 sieht man wie der Taster mit dem PIC verbunden ist.
Von den internen Pulldown Widerständen höre ich zum ersten mal etwas. Wie schalte ich die denn ein bzw. aus?
|
BID = 870576
Offroad GTI Urgestein
Beiträge: 12710 Wohnort: Cottbus
|
Zitat :
| Von den internen Pulldown Widerständen höre ich zum ersten mal etwas. | Das sind Pull up-Widerstände, weil sie nach Vcc (also "nach oben") geschaltet werden.
Schau dich doch mal hier um: http://www.sprut.de/electronic/pic/grund/grund.htm
Edit: Du kannst nicht einfach if(RAx) sagen, du musst zumindest erst mal definieren, dass dies ein Eingang sein soll.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
[ Diese Nachricht wurde geändert von: Offroad GTI am 27 Jan 2013 9:47 ]
|
BID = 870584
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
RA3 ist immer als Eingang geschalten, steht in der Beschreibung drinnen.
|
BID = 870585
Ltof Inventar
Beiträge: 9322 Wohnort: Hommingberg
|
Hast Du den externen Reset deaktiviert?
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
|
BID = 870587
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
Nicht dass ich wüsste, wie kann ich den deaktivieren?
|
BID = 870589
Ltof Inventar
Beiträge: 9322 Wohnort: Hommingberg
|
Keine Ahnaung wie das in C geht. Der Taster hängt nicht nur an RA3, sondern kann auch Reset sein - je nach Konfiguration.
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
|
BID = 870607
basti2s Gelegenheitsposter
Beiträge: 94 Wohnort: Leutkirch
|
Habe gerade den vermutlichen Fehler gefunden. Wenn das PICKit an der Platine Steckt, kann der Port RA3 nicht funktionieren, habe ich in einem Forum gelesen.
Nun will ich einfach einen anderen PIN für den Taster verwenden. Wie Schließe ich denn extern einen Taster an? einfach die +5V auf den Pin legen, oder sollte ich zur Sicherheit einen Vorwiederstand verwenden?
|
BID = 870608
Offroad GTI Urgestein
Beiträge: 12710 Wohnort: Cottbus
|
Das sind "Spannungseingänge", brauchen also keinen Widerstand. Den brauchst du nur, um den Eingang auf ein definiertes Potential zu ziehen, wenn der Taster nicht gedrückt ist.
Also Pullup/Pulldown Widerstände (wobei ersterer auch intern im µC zugeschaltet werden kann)
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 870627
Ltof Inventar
Beiträge: 9322 Wohnort: Hommingberg
|
|