Hallo,
ich bin gerade dabei meine erste Versuche mit einem Attiny 2313 zu
machen. Die Ports komplett anzusprechen funktioniert super, allerdings
schaff ich nicht ein einzelnes bit anzusprechen. Für dies kenn ich
normalerweiße den Befehl sbit in C, aber mit diesem bekomm ich einen
Fehler beim kompilieren. Das ganze Register will ich nicht ansprechen,
da ich nur einen Ausgang auslesen will und die anderen dazu nicht
relevant sind.
Gruß Andreas
Das Programm ist nur zum testen und soll ein Lauflicht laufen lassen
solange der entsprechende Taster gedrückt ist:
int main (void)
{
DDRB = 0xFF; //Port D als Ausgang definieren
DDRA = 0X00; //Port A als Eingan definieren
for (;;) { // Schleife
if ( PINA == 0x02)
{
PORTB = 0x80;
_delay_ms(250);
PORTB = 0x40;
_delay_ms(250);
PORTB = 0x20;
_delay_ms(250);
PORTB = 0x10;
_delay_ms(250);
PORTB = 0x08;
_delay_ms(250);
}
}
}
Hallo,
ihr seid super, danke für eure schnellen Antworten!!
Leider kommt es jetzt noch zu einem Fehler und zwar wenn ich die
definierte Variable verwende, dann bringt mit der compiler:
../Blink.c:34: error: lvalue required as left operand of assignment
Gruß Andi
Michael H. schrieb:> Uwe S. schrieb:>> Man muss nicht sofort versehen, was da genau passiert, außer wie man es>> anwendet.>> genau das ist größtmöglicher stumpfsinn!
und die bestätigung dafür folgt natürlich auf dem fuße!
Andreas M. schrieb:> ../Blink.c:34: error: lvalue required as left operand of assignment
besten dank!
Hallo,
schön zu sehen das die Benutzer eines Forums immer gleich sind egal um
welches Thema es geht!
Danke Uwe, genau das mit dem Sbit habe ich gesucht!
@Michael, das Leistungsfähige Macro habe ich gar nicht benutzt, also
keine Grund zur aufregung.
@ alle die Ihre Einkaufslisten hier einbringen, die helfen mir nicht
wieder!
Gruß Andreas, dessen erste Begeisterung langsam nachlässt von diesem
Forum.
Hallo Jakov,
danke für deine Hilfe. Ich hatte den struct bit vergessen, da ich dachte
es handelt sich um eine andere Methode die Pins zu definieren. Weißt du
wo man nachlesen kann was der struct bit teil genau macht?
Nun habe ich leider noch das Problem wenn ich die Variable zum ersten
mal verwende sagt der compiler:
../Blink.c:51: error: 'volatile struct bits' has no member named 'bDDA1'
Gruß Andreas
Andreas M. schrieb:> ../Blink.c:51: error: 'volatile struct bits' has no member named 'bDDA1'
Psst, ich verrate Dir mal ein Geheimnis:
Die 51 hinter dem Filenamen ist die Zeilennummer, wo der Fehler wirkt.
Diese Zeile must Du angucken oder uns zeigen.
Und die Meldung besagt, daß er den Text "DDA1" gefunden hat, Du aber
nirgendwo etwas sinnvolles dafür definiert hast.
Du kannst aber auch einfach meine oben verlinkte sbit.h includieren, das
vermeidet solche Fehler.
Peter
Hallo Peter,
danke für den Tipp, das wusst ich zwar schon, hat mich in dem Fall
leider nicht weiter gebracht, da in den Zeilen nicht viel steht, ich
glaube der Fehler liegt immer noch irgendwo an der Dekleration!
Deine Methode funktioniert um den Eingang und den Pullup zu Schalten
ohne das der Compiler meckert, aber sobald ich dies in der IF Schleife
verwende will es nicht funktionieren if(PIN_D0 ==1).
Die Methode mit define gefällt mir, da ich hiermit meine Namen frei
vergeben kann, deswegn hoff ich das ich es auf diese weise zum laufen
bekomme!
Ich hoffe doch, das auch ich es irgendwann schaffe den Eingang zu
lesen...
Ingo schrieb:> Ich finde solche Makros nicht hilfreich, weil oft vergessen wird was> eigentlich passiert...
Sag das nicht so leichfertig - das demonstriert doch Herrschaftswissen
...
(und wenn der Makro noch so blöd ist)
Andreas M. schrieb:> if ( S1 == 0) //../Blink.c:65: error: 'volatile struct bits' has no member named
'bPD0'
Du mußt das Macro SBIT aus meiner sbit.h schon vollständig kopieren!
Es besteht nämlich aus 2 Defines.
Das 2. sieht nur so aus, als wäre es überflüssig, ist es aber nicht.
Es macht im ersten Paß die Auflösung des "PD0" zu "0".
Erst dann kann der 2. Durchlauf es verwenden und "b0" draus bauen.
Peter
Es funktioniert, ich danke dir!!!!
Zuvor wollte ich es noch mit der Methode von Uwe zum laufen bringen, die
mir eigentlich sehr gut gefällt. Ich hoffe ich finde noch heraus warum
diese nicht geht, solange werde ich nun mit deinem Header arbeiten!
Dieser funktioniert zwar noch nicht zum einbinden, aber ich habe jetzt
zum testen den kompletten Code kopiert!
Danke!
Gruß Andi
Und dies wäre auch so komplett in den deinen Code zu übertragen.
Peter hat dann seine Idee auch in seine |sbit.h| eingearbeitet.
Wie immer ist sein Code oder seine Ideen sehr ausgeklügelt, ergeben
kompakten und schnellen Code. :-)
Beispiel: "3x4 Matrix keypad Routine"
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=699758&sid=84007a05eee6cd43a18ed6804d63caa4#699758
Aber Dein Problem liegt ganz wo anders, dass Du nicht weist, wie ein
|#inlcude "<DATEI.H>"| funktioniert.
Das Prinzip nennt man modularisieren.
_
Hallo,
das hatte ich übersehen, das dies bereits von Peter war.
Der Sinn einer Header Datei ist mir schon klar, wie gesagt hatte es aber
auf die schnlle nicht funktioniert und ich wollte es nach zwei tagen
schaffen den Eingang zu lesen! Es wird auch noch eine weile dauern bis
alles so funktioniert wie es soll, inklusive header!
Danke!
Also ich schreibe das immer so:
if((PORTB&1)==1) {
}
Da wird zuerst das relevante Bit ausgeundet und dann wird verglichen, ob
dieses 1 oder 0 ist.
Ist für mich auch übersichtlicher.
hallo andreas,
eine kleine anmerkung meinerseits:
da du gerad erst anfängst zu "programmieren", gewöhn dir lieber direkt
eine korrekten aufbau deines codes an.
z.b. richtige einrückungen, weniger leerzeilen etc.
dadurch wird der code für andere besser leesbar und du selbst findest
evtl. auch schneller einen fehler!
gruß