Hallo! Ich stecke wie ja bekannt noch in den Anfängen des Ganzen hier. ICh wollte jetzt folgendes Programm basteln, aber ich finde einfach keinen Befehl, mit dem ich es hinbekomme bzw wie ich das Programm zusammen basteln soll... vielleicht könnte ja einer das fertige Programm mit einer zeilenweisen Erklärung reinstellen, dass wäre natürlich super, dann könnte ich mir das mal genau ansehen... Programm soll folgende Funktion haben: S1 and not S2 and S3 = H1 Hoffe ihr könnt mir helfen! Gruß Dominik
Controller? Programmiersprache? if (S1 && (!S2) && S3) { H1 = 1; } else { H1 = 0; } Das war C...
Programmiere das mit AVR Studio und dann will ich es auf dem STK 500 testen! Ja C und SPS-Sprache kann ich ja, nur ich habe zur Zeit noch derbe Probleme mit den Befehlen für den MC. Hab mir jetzt schon sone 2 seitige Liste mit allen Befehlen besorgt...
Wenn Du sagst, was genau S1..3 und H1 sind, dann kannst Du sicher besser geholfen werden...
Was sind S1 bis S3? Bitkonstanten? Dann müsstest du die Zugehörigkeit mit in die Abfrage bringen: if ((PINB &(1<<S!) && (!(PINB &(1<<S2)) && (PINB &(1<<S3)) { ... } wenn Port B (Eingang) abgefragt werden soll
Ich glaub' ich hab' 'ne Klammer vergessen: if ((PINB &(1<<S!) && (!(PINB &(1<<S2)) && (PINB &(1<<S3)))
Ups: if ((PINB &(1<<S!)) && (!(PINB &(1<<S2))) && (PINB &(1<<S3))) jetzt aber!
Das hiesige AVR-GCC-Tutorial hast du dir schon angeguckt, oder? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Sorry.. mit S1 S2 und S3 meinte ich Taster, also die Taster auf dem STK500 und mit H1 die LED1... komme aus der "grob" Elektrik g In SPS Sprache wäre das ja nen Kinderspiel...
>In SPS Sprache wäre das ja nen Kinderspiel... Eine SPS hat hier auch schon irgendwer mit einem AVR umgesetzt. Zum "STK500-Problem": Wie hast du die Flachbandkabel angeschlossen; sprich: Welcher Port ist mit den Tastern verbunden und welcher mit den LEDs? Die Taster des STK500 sind übrigens low-aktiv (gedrückt = 0V) und die LEDs leuchten auch nur, wenn man eine 0 am entsprechenden Port ausgibt. Ist das dein allererstes Programm? Dann würde es sich anbieten erst mal die LEDs leuchten zu lassen, dann blinken und dann ein Lauflicht zu programmieren. Dann kann man mit den Tastern rumspielen. Das einfachste Programm ist sowieso: PORTA = PINB; (natürlich in ein C-Programm verpackt).
Hallo! Habe die LEDs schonmal leuchten lassen mit dem Programm S1 and S2 =H1.. War aber auch schon ein schwieriges Unterfangen! Also die Taster stecken auf Port D und die LEDs auf Port C Danke schonmal vorab für die gute Hilfe hier...
if ((!(PIND &(1<<1))) && (PIND &(1<<S2)) && (!(PINB &(1<<S3))) { PORTC &= ~(1<<1); } else { PORTC |= (1<<1); Und das schön ein C-Programm verpacken. Die Klammern mußt du vielleicht noch mal durchzählen...
Es müssen Brücken von den Tastern (Pfosten SWITCHES) zu den Eingängen des µC (Pfosten PORTA...PORTD) und eine Drahtbrücke von den LEDs (Pfosten LEDS) zum Ausgang des µC (Pfosten PORTA...PORTD) gesteckt werden.
Hallo, wieso in einem C Programm? Habe bisher immer so programmiert include "4433def.inc" ;bzw. 2333def.inc ldi r17, 0xFF out DDRC, r17 ;Port B durch Ausgabe von 0xFF ins ;Richtungsregister DDRB als Ausgang konfigurieren ldi r17, 0x00 out DDRA, r17 ;Port D durch Ausgabe von 0x00 ins ;Richtungsregister DDRD als Eingang konfigurieren loop: in r17, PINA ;an Port D anliegende Werte (Taster) nach r16 einlesen out PORTC, r17 ;Inhalt von r16 an Port B ausgeben rjmp loop ;Sprung zu "loop:" -> Endlosschleifede" -> Endlosschleife Das war jetzt nen Beispiel aus dem AVR Studio! Diese programmstruktur bräcuhte ich!
>wieso in einem C Programm? >Ja C und SPS-Sprache kann ich ja Solche Aussagen lassen darauf schliessen.
Warum sagste nicht gleich, dass Du in Assembler programmierst? Dann hätten sich viele Leute viel Arbeit sparen können. Stattdessen erzählst Du was von C un SPS... In Deinem Beispiel schreibst Du > in r17, PINA ;an Port D anliegende Werte (Taster) nach r16 einlesen > out PORTC, r17 ;Inhalt von r16 an Port B ausgeben Überlege bitte mal, ob Du wirklich weißt, was Du willst. Und wenn ja, dann sorge dafür, dass Programm und Kommentar sich nicht widersprechen. Bringt Dich selber wahrscheinlich auch durcheinander... Also, wenn S1..3 an den Pins 1..3 von Port D hängen, dann könnte das so aussehen: loop: in r16, PIND andi r16, 0b00001110 ;Pins maskieren, Bits 1..3 cpi r16, 0b00001010 ;Vergleich mit Maske "S1 && !S2 && S3" breq led_ein ;Springe zu "LED einschalten" sbi portc, 0 ;LED an PORTC.0 aus rjmp loop led_ein: cbi portc, 0 ;LED an PORTC.0 ein rjmp loop
wer das Programm von johnny mal testen und meld mich dann gleich nochmal... Danke schonmal für eure Hilfe... die Erklärungen dahinter bringen mir schon ne ganze Menge!
Ach ja, die Taster sind beim STK500 in meiner Erinnerung ja Low-aktiv. Muss also unten heißen ;... andi r16, 0b00001110 ;Pins maskieren, Bits 1..3 cpi r16, 0b00000100 ;Vergleich mit Maske "S1 && !S2 && S3" ;...
Studio eingegeben und laut dem Studio sind 7 Fehler drin Hier mal Das Programm.. include "4433def.inc" ldi r16, 0xFF ;PortC als Ausgang konfigurieren out DDRC, r16 loop: in r16, PIND andi r16, 0b00001110 ;Pins maskieren, Bits 1..3 cpi r16, 0b00000100 ;Vergleich mit Maske "S1 && !S2 && S3" breq led_ein ;Springe zu "LED einschalten" sbi portc, 0 ;LED an PORTC.0 aus rjmp loop led_ein: cbi portc, 0 ;LED an PORTC.0 ein rjmp loop Ich verzweifel langsam noch.. sich das selber beizubringen ist nicht so einfach wie ich mir das gedacht habe! Danke für eure Geduld...
Kleine Ursache, aber grosse Wirkung... Hab den fehler gefunden der zu den problemen geführt hat.. der . vor include hat gefehlt.
So wie es oben steht, bekomme ich 2 Fehler. Wenn ich den fehlenden Punkt vor dem include reinmache, assembliert er fehlerfrei...
Programm ist nun auf dem Board...und läuft Kann ich eigentlich die Taster nur hexadezimal maskieren oder auch anders?
binäre Schreibweise: 0b00000100 hexadezimale Schreibweise: 0x04 dezimale Schreibweise: 4 Das sollte man sich aussuchen können. Falls du dich demnächst mit den im AVR integrierten Bausteinen (Timer, USART etc) beschäftigst, solltest du dir gleich die (1<<xyz)-Schreibweise angewöhnen, wobei xyz für die Bit-Bezeichnung steht. Das erhöht die Lesbarkeit ungemein. Die BitBezeichnungen findet man im Datenblatt. Da gibt es meist auch Codebeispiele in asm und C.
Wieso hexadezimal? In meinem Beispiel sind sie binär maskiert... Du kannst selbstverständlich anstelle von "0b00001010" auch "0x0a" oder "10" schreiben, aber besonders anschaulich ist das glaub ich nicht. Du willst das Programm ja später auch noch lesen können. Wenn Du mit den Portpin-Definitionen aus der 4433def.inc arbeitest, kannst Du aber auch die C-Notation nehmen, die in den anderen Beispielen oben angegeben ist, also anstelle von "0b00001010" "(1 << PIND3)|(1 << PIND1)" schreiben...
mhh.. das sind so details mit denen ich mich noch intensiv beschäftigen muss... habe lange nichts mit den verschiedenen Zahlensystemen gemacht.. merke das ich schwer eingerostet bin...
noch ne blöde Frage.. wie ist denn die Wertigekit der einzelnen Taster?
Es sind acht Taster. Ein Byte hat acht Bit. Die Taster sind durchnummeriert. Entweder von 0 bis 7 oder von 1 bis 8 (ich vermute mal von 0 bis 7). Benutzt man jetzt die Nummer (0..7) des Tasters, hat man den Exponenten der Wertigkeit zur Basis 2. Bei der binären Darstellung steht links das Bit mit dert höchsten Wertigkeit und rechts das mit der niedrigsten (2^0 = 1).
Was verstehst Du unter "Wertigkeit"? Wenn ein Taster an Pin 3 von Port D hängt, dann ist seine "Wertigkeit" 2^3, also 8, wenn es das ist, was Du meinst...
Meine Güte, heute klappt das mit dem "gleichzeitig-posten" aber ganz hervorragend...
Genau die gleiche wie die Bits, die sie im Program repräsentieren wenn du das Byte vom Port einliest an dem die Taster hängen. 0b00000000 ^^^^^^^^ |||||||1 ||||||2 |||||4 ||||8 |||16 ||32 |64 128 Aber das interssiert eigentlich niemanden wirklich, da man solche Dinge sowieso nicht dezimal angibt (ausser man ist Masochist).
@Rahul: Meinste net, dass das alphabetisch geht? "i" kommt dummerweise vor "j". Sollte mich vielleicht in Zukunft "Alfons" nennen...
´´Habe gerade mal versucht auf PIN A einzulesen, da gibt er mir folgende Fehlermeldung... liegts an mir oder am Board? Recicht es für "in r16, PIND" einfach "in r16, PINA" zu schreiben oder muss noch mehr geändert werden? Building project... C:\Dokumente und Einstellungen\Phil>del "C:\Dokumente und Einstellungen\Phil\test0409.lst" C:\Dokumente und Einstellungen\Phil\test0409.lst konnte nicht gefunden werden C:\Dokumente und Einstellungen\Phil>"C:\Programme\Atmel\AVR Tools\AvrAssembler\avrasm32.exe" -fI -o "C:\Dokumente und Einstellungen\Phil\test0409.hex" -d "C:\Dokumente und Einstellungen\Phil\test0409.obj" -e "C:\Dokumente und Einstellungen\Phil\test0409.eep" -I "C:\Dokumente und Einstellungen\Phil" -I "C:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes" -w -m "C:\Dokumente und Einstellungen\Phil\test0409.map" "C:\Dokumente und Einstellungen\Phil\test0409.asm" AVRASM: AVR macro assembler version 1.76.4 (Aug 6 2004 07:02:13) Copyright (C) 1995-2004 ATMEL Corporation Creating 'C:\Dokumente und Einstellungen\Phil\test0409.eep' Creating 'C:\Dokumente und Einstellungen\Phil\test0409.hex' Creating 'C:\Dokumente und Einstellungen\Phil\test0409.obj' Creating 'C:\Dokumente und Einstellungen\Phil\test0409.map' Assembling 'C:\Dokumente und Einstellungen\Phil\test0409.asm' Including 'C:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\4433def.inc' C:\Dokumente und Einstellungen\Phil\test0409.asm(8) : error : Undefined variable referenced Assembly complete with 1 error Deleting 'C:\Dokumente und Einstellungen\Phil\test0409.eep' Deleting 'C:\Dokumente und Einstellungen\Phil\test0409.obj' Deleting 'C:\Dokumente und Einstellungen\Phil\test0409.hex' Deleting 'C:\Dokumente und Einstellungen\Phil\test0409.map' Jetzt blicke ich wenigstens schonmal bei dem ZTahlensystem wieder durch! Mühsam ernährt sich das Eichhörnchen! ;-)
Was kann ich denn machen um den Port a benutzen zu können? Weil so ist das ja mist!
[OT]
l kommt auch noch vor m...
Meinst du, Andreas hat hier noch einen Beitragsnamensortieralgorithmus
mit eingebaut?
>Mühsam ernährt sich das Eichhörnchen! ;-)
Kennst du "Hammy"? Cola trinken verhilft manchmal zur höheren
Geschwindigkeit.
[/OT]
@Problem: Ich vermute es licht daran, dass dein Controller gar keinen
Port A hat. (Gibt's das?)
Wenn Du Port A benutzen willst, musst Du Dir einen Controller kaufen, der einen hat (Mega16, 32, 8515, 8535... nur um ein paar Beispiele zu nennen)...
Ein Mega16 war zumindest bei meinem "letzten"* STK500 dabei. (*) das für die Firma.
Dann hast Du ein älteres STK500. Der 90S8515 hat aber auch nen Port A. Wenn Du allerdings die 4433def.inc einbindest, kann das mit dem 8515 nicht klappen. Dann musst Du schon die 8515def.inc einbinden...
Hallo! So habe mal ein bisschen rumgetestet und hoffentlich endlich verstanden. Jetzt hätte mal ne andere Frage.. Habe 2 Seiten mit verschiedenen befehlen von ATMEL. Als Beispiel nehme ich mal das ANDI. Auf dem Blatt steht dann da: ANDI / Rd, K / Logical AND Register and Constant / RD < Rd * K Verstehe nicht wie man das Rd < Rd * K liest bzw. was es bedeutet. Wofür steht das Mal Zeichen und so..etwas schwer zu erklären.. Hoffe ihr versteht was ich meine... Gruß Dominik
Halte dich einfach an die Beschreibung. Das '*' ist einfach nur ein Symbol, das für UND benutzt wurde und hat an dieser Stelle nichts mit Multiplikation zu tun. So was wird in der Mathematik gerne gemacht: Irgendwelche Symbole muss man ja nehmen, um eine Operation zu kennzeichnen. Da kann man auch vertraute Symbole benutzen, solange man nur definiert, was jedes Symbol bedeuten soll.
@Dominik: Drücke mal in AVR-Studio die F1-Taste während der Cursor (im Editor) auf einem ASM-Befehl steht. Bit- & Bytebruch... ...HanneS...
ATMEL hat in Datenblättern und im Instruction Set Manual bei Verknüpfungen eine etwas gewöhnungsbedürftige Notation für die logischen Operatoren: + entspricht ODER + mit Kreis drumrum entspricht EXKLUSIV-ODER dicker Punkt entspricht UND Hoffe, das hilft Dir weiter.
Das hat schon seinen Sinn. Wenn ich 2 Zahlen addiere, dann ist das Ergebnis wahr, wenn eine der beiden wahr ist (= ODER) Wenn ich 2 Zahlen multipliziere, dann ist das Ergebnis nur dann wahr, wenn beide wahr sind (= UND). Heutige Logiksprachen (Abel) können aber auch richtig addieren und multiplizieren, daher wird dort & für UND und # für ODER genommen. Peter
@Peter: Klar ist das logisch, und ich persönlich komme damit gut klar, aber die Notation ist in meiner Erfahrung eher ungebräuchlich...
Wie kann ich folgende Anweisung bzw Operation verstehen? BREQ: if (Z=1) then PC<PC+k+1 Arbeite gerade die Liste der Operationen durh um sie zu verstehen und hier bin ich mir nicht ganz klar...
Wenn Zero-Flag (Z) gesetzt, dann addiere zum aktuellen Stand des Programmzählers (Program Counter, PC) den Wert k und eine 1.
Wobei bei den Branch-Befehlen meist das Lebel angegeben wird, zu dem gesprungen werden soll. Den Offset dazu berechnet der Assembler alleine. Einige ASM-Quelltexte auf relativ niedrigem Niveau (also gut zum Lernen für den Einsteiger) findest Du z.B. hier: http://www.hanneslux.de/avr/divers/index.html Bit- & Bytebruch... ...HanneS...
Mhh.. also so langsam blicke ich endlich durch...aber das is sicher nur subjektiv und beim nächsten Programm häng ich wieder in den Seilen... mhh. Wer bietet mir live Nachhilfe? Gegen Bezahlung? g Problem wird einfach sein, dass ich es bis nächstes Jahr recht gut können muss und das am besten schnell...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.