hallo,
habe vor kurzem mit dem programmieren angefangen und habe jz ein prob.
1
#include<avr/io.h>
2
#include<inttypes.h>
3
4
unsignedcharoutput_value;
5
6
intmain()
7
8
{
9
DDRB=0xFF;
10
PORTB=0x00;
11
12
DDRC=0x00;
13
PORTC=0x04;
14
15
do
16
{
17
if(!(PIND&0x04))
18
19
{
20
output_value=!output_value;
21
}
22
23
PORTB=output_value;
24
}
25
while(1);
26
}
habe einen atmega8 (ohne externen takt)
und das will nicht so richtig funk. =(
ich bekomme die LED nicht zum leuchten. habs schon mal mit entprellen
versucht aber dadurch wirds auch nicht besser...
glg
Prüfe mal, ob du die richtigen Ports initialisierst und ob du genau die
auch nutzt.
Weiter: ist deine Initialisierung richtig?
Eine Flankenerkennung fehlt dir aber trotzdem. Solange der Eingang aktiv
ist, wird der Teilung in "if" ausgeführt. Für eine Flankenerkennung
musst du dir den vorher eingelesen Zustand in einer statischen Variable
merken.
Dav Kirschner schrieb:> habs schon mal mit entprellen> versucht aber dadurch wirds auch nicht besser
Dann war das auch kein richtiges Entprellen.
Es soll sogar Leute geben, die denken Entprellen und Delay wäre
dasselbe.
Idealer Weise nimmt man ne Entprellroutine, die gleich die Drück-Flanke
mit erkennt (fällt quasi beim Entprellen mit ab).
Die Flanke wird ja fast immer benötigt und nicht so sehr der entprellte
Zustand.
Das spart fürderhin ne Menge Programmierarbeit und man kann sich besser
auf die eigentliche Aufgabe konzentrieren.
Peter
@ stefan,
danke mit "~" hats geklapt =) und bei DDRC hab ich nur probiert ob mein
PORT defekt ist...und habs vergessen umzusreiben xD
und wie macht man so eine entprellung ohne delay?
glg
Guten Tag
Ich wollte an PINB0 ein Signal anschliessen das Steigende und Fallende
Flanke ausgibt, der attiny13a sollte dann das Signal in einer Variabel
speichern und wieder mit PINB0 vergleichen ob es sich verändert hat.
Oder kann man so nur High und Low auswerten. Weill das Signal nur die
Spannung verändert und nicht High auf Low schaltet??
Vielen Dank für die Hilfe.
•
1
#include<avr/io.h>
2
#include<stdint.h>
3
#define F_CPU 1000000UL
4
#include<util/delay.h>
5
6
uint8_tAPortD,BPortD,CPortD;
7
8
intmain(void){
9
10
DDRB|=(1<<PB1)|(1<<PB2);// PB1, PB2, auf ausgang//
wie willst du denn eine Flanke erkennen, wenn du in deinem ganzen Code
keinen Eingang abfragst? Und überleg doch bitte mal, was in deinen
If-Abfragen steht...
Zumal wenn der richtige Artikel bereits verlinkt war.
Und sieh die mal die Definitionen von PINB0 etc. an. Und versuche mal,
die if-Bedingungen en detail zu erklären, vielleicht merkst du ja dann
selber, dass die abstrus sind.
if(APortD||APortD>PINB0)//vergleicht variabel APortD mit PINB0
und das ist immer noch totaler Schwachsinn!
tu dir selbst einen Gefallen, nehm dir ein C-Buch und lern erstmal die
Grundlagen, unabhängig von einem µC...
Guten Tag
Würde es so gehen??
APortD = PINB0; //Variable Speichern//
APortD1 = PINB0;
Und dann variable APortD und APortD1 miteinander vergleichen??
Oder muss ich einen anderen Pin dazu ziehen??
Vielen DANK
P.S welches C Buch würdest Du mir empfehlen.
Bischen Ahnung schrieb:> APortD = PINB0; //Variable Speichern//> BPortD = PINB1;> CPortD = PINB2;
Was meinst du mit "Variable Speichern"?
Was erwartest du, welche Werte diese Variablen nach diesen Zuweisungen
haben und was bedeuten diese Werte deiner Meinung nach?
> Wahr = 1; //erkennt if abfrage als wahr//
Der Kommentar lässt schon Schlimmes vermuten...
> if (PINB & (1<<PINB0)) //Fragt PINB0 ab//
Und dies ist genau die einzige Stelle, an der du tatsächlich den Pin
abfragst!
> {> if (APortD || APortD < PINB0) //vergleicht variabel APortD mit> PINB0 ob kleiner geworden ist = fallende Flanke//
Hint: PINB0 ist ein Präprozessor-Makro, das konkret zu 0 ersetzt wird.
Da verändert sich niemals nichts.
> {> if (Wahr) //Ist das wahr//
Und hier bestätigt sich die Befürchtung. Du kannst noch so oft eine
Variable für "Wahr" verwenden, de facto ist es eine Konstante und es
würde mich sehr wundern, wenn die nicht wegoptimiert würde. Auch wenn
sie erstmalig mit 0 initialisiert wird, gibt es nur eine einzige
Zuweisung am Beginn deines Programms. Wahr ist immer 1, diese Bedingung
also immer wahr...
> {> PINB |=(1<<PB1); //Schaltet PINB1 auf High//
Bist du sicher, dass du PINB zuweisen möchtest. Dieses SFR hat zwar die
spezielle Eigenschaft, den Pin zu toggeln, wenn du 1 zuweist, aber
irgendwie bezweifel ich, dass das deine Intention war.
> }> else //Wenn nicht//
...und der else-Zweig kann nie ausgeführt werden.
> {> PINB |=(0<<PB1); //Schaltet PINB1 auf Low//
s. oben. und
PINB |= (0 << PB1);
ist funktional äquivalent zu
PINB = PINB;
Also: zusätzlich zu Entprellung guckst du hier: Bitmanipulation
und befasst dich mit den Grundlagen der Sprache C.
Bischen Ahnung schrieb:> Und dann variable APortD und APortD1 miteinander vergleichen??
und was soll es bringen, '0' und '0' zu vergleichen?
PINB0 ist '0' und bleibt '0', dennso ist PINB0 definiert, eine simple
'0' und mehr nicht. Damit ist auch APortD einfach '0' und ändert sich
auch nie, da du ja nie auch nur versuchst, einen neuen Wert
zuzuweisen...
Malte S. schrieb:> Was meinst du mit "Variable Speichern"?
ich vermute/befürchte, er würde damit APortD auf irgendeine magische
Weise mit PINB0 'verknüpfen'... und dass er die Bedeutung von PINB0
überhaupt nicht versteht hast du ja auch verstanden...
Guten Tag
Ich bin jetzt am C-Tutorial von NR-Wissen am lernen.
Könnte mir jemand die Flankenerkennung von der seite
mikrocontroller/Entprellung erklären??
Bischen Ahnung schrieb:> Guten Tag>> Ich bin jetzt am C-Tutorial von NR-Wissen am lernen.>> Könnte mir jemand die Flankenerkennung von der seite> mikrocontroller/Entprellung erklären??
Was ist denn eine Flanke?
Eine Flanke ist der Wechsel eines Zustands.
Wenn du zum Nachbarn schaust, dann merkst du dir, dass dort das Licht
nicht brennt.
Beim nächsten mal hinsehen brennt das Licht immer noch nicht. D.h. du
weißt, das sich nichts getan hat.
Gleich darauf schaust du nochmal hin. Das Licht brennt immer noch nicht.
Ein paar Sekunden später fällt dein Blick wieder rüber (du kontrollierst
den Status des Lichtes). Aha! Diesmal brennt das Licht! D.h durch den
Vergleich "vorhin hat es noch nicht gebrannt, jetzt aber brennt es" hast
du die 'Flanke' "Das Licht wurde eingeschaltet" erkannt.
1
...
2
3
alter_Licht_Status = wie ist das Licht jetzt;
4
5
while( 1 ) {
6
7
neuer_Licht_Status = wie ist das Licht jetzt;
8
9
if( alter_Licht_Status != neuer_Licht_Status )
10
{
11
if( neuer_Licht_Status == brennt )
12
Heureka! Jemand hat jetzt gerade das Licht aufgedreht
13
else
14
Damn! Jemand hat jetzt gerade das Licht aus gemacht
15
16
alter_Licht_Status = neuer_Licht_Status;
17
}
18
}
denk darüber nach, wende das Kochrezept auf deine Taste an.
Und kapere keine 3 Jahre alten Threads mehr.