mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Projekt! Dringend!


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also ich habe den Auftrag ein Lauflich zu Programmieren auf einem
ATmega8.

Ich habe 2 Lichtmodis mir ausgedacht und wollte diese jeweils durch
einen schalter von einander trennen.

Ich habe das Programm soweit geschrieben, allerdings läuft es nicht auf
meinem mikrocontroller.

Könnte bitte einer mal ein Auge auf das Programm werfen und mir sagen
was ich verbessern muss.

Bin am verzweifeln -.-

Code:

;*************************************;
;*Programm: Knight Rider Lauflicht RL*;
;*************************************;
;*Autor:        Heller Tobias     *;
;*Datum:           16.02.2006        *;
;*Letzte Änderung: 16.02.2006        *;
;*Version:         1.0               *;
;*************************************;


.include "m8def.inc"


ldi r16, 0xff      ;Port D wird als Eingang deklariert
out DDRD, r16

ldi r16, 0x00
out ddrb, r16

ldi r19,LOW(RAMEND)    ;Initailsierung für Unterprogramme
out SPL, r19
ldi r19,HIGH(RAMEND)
out SPH, r19

start:

rjmp schalter



Funky:

  rcall FunkyTown




;Hier steht die Procedure zu dem Lauflichtmodus KnightRider

KnightRider:

   ldi r16, 0b10000000      ;Die LED Nr.1 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b01000000      ;Die LED Nr.2 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00100000      ;Die LED Nr.3 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00010000      ;Die LED Nr.4 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00001000      ;Die LED Nr.5 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00000100      ;Die LED Nr.6 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00000010      ;Die LED Nr.7 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00000001      ;Die LED Nr.8 leuchtet
  out PORTD, r16

  rcall Warteschleife


  ldi r16, 0b00000001      ;Die LED Nr.8 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00000010      ;Die LED Nr.7 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00000100      ;Die LED Nr.6 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00001000      ;Die LED Nr.5 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00010000      ;Die LED Nr.4 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b00100000      ;Die LED Nr.3 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b01000000      ;Die LED Nr.2 leuchtet
  out PORTD, r16

  rcall Warteschleife

  ldi r16, 0b10000000      ;Die LED Nr.1 leuchtet
  out PORTD, r16

  rjmp start



;Hier steht die Procedure zu dem Lauflichtmodus "Funky Town"


Funkytown:

  ldi r16, 0b00011000      ;Die LED Nr.1 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b00100100      ;Die LED Nr.2 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b01000010      ;Die LED Nr.3 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b10000001      ;Die LED Nr.4 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b01000010      ;Die LED Nr.5 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b00100100      ;Die LED Nr.6 leuchtet
  out PORTd, r16

  rcall Warteschleife

  ldi r16, 0b00011000      ;Die LED Nr.7 leuchtet
  out PORTd, r16

  rjmp start




;Procedur für DIE Warteschleife


Warteschleife:



    loop2:  ldi r17,0x01
        ldi r18,0x01
    loop1:  dec r18
        brne loop1
        dec r17
        brne loop2

    ret


Schalter:

in r20, portb
sbis portb, 1
rjmp KnightRider
rjmp Funkytown



ich weiß, dass das Programm sehr simpel und umständlich geschrieben
ist, also bitte keine Kommentare von wegen "was bistn du fürn Depp"
oder so ^^

schonmal danke im vorraus.

mfg Tobi

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst Du denn mit "läuft nicht"? Kannst Du eine einzelen LED zum
blinken bringen? Hast Du schon irgendein Programm auf diesem Controller
zum laufen gebracht? Welchen Oszillator benutzt Du? Sind die Fuses
korrekt programmiert?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhhh ma ganz langsam ^^

also habe ein programm vom freund draufgehabt da hat alles wunderbar
funktioniert.

im simulator funktioniert es, allerdings nicht afu dem board.

was für einen ozilator ... einen quarz mit 4, 0000 MHZ

Was sind Fuses wenn ich fragen darf?

mfg Tobi

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tobi...

Deine Warteschleife ist so kurz, damit du nie ein Lauflicht sehen
kannst. Deine Pause dauert 6 Takte bei 4 MhZ. Besser wären da 2
Millionen Takte als Pause, dann hast du alle 0,5 Sekunden ein
Lauflichtwechsel.

Es gibt doch diesen AVR Delay Generator, der könnte für dich sehr
nützlich sein.

Gruß Florian

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Flo, danke für deine antwort.

habe die schleife normalerweise auf 0xFF stehen.
0x01 ist nur zum testen, weil man dann bei step to step sieht ob es
funkst.

ist dieser delay generator beim normalen AVR studio dabei?

und wie bekomme ich das mit dem schalter geregelt?

habe den schalter jetzt mit einem 10k ohm vorwiederstand an den
controller und an masse angeschlossen an PB1

Danke im vorraus.

mfg Tobi

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen dem Delay Generator schaue mal hier:

http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html

Ein Schalter gehört normalerweise mit einem Pin zum µC un mit dem
anderen direkt auf Masse. Die 10 KOhm gehören dann einmal zum µC und
einmal auf 5v. Somit ist der Eingang immer auf +5V und sobald du
drückst auf Masse.

Gruß Florian

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also im moment ist der so:

PB1 -> 10 kohm -> schalter -> masse

ist das jetzt falsch? :o

und ist die programmierung von der Procedur Schalter falsch?

danke für die seite

mfg Tobi

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die 10kohm muessen gegen +5V!

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja... wo ichs gerade so seh:
http://www.mikrocontroller.net/tutorial/io-basics <-- da stehs
und du must den Taster entprellen

Autor: Tim Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ldi r16, 0xff      ;Port D wird als Eingang deklariert
> out DDRD, r16
>
> ldi r16, 0x00
> out ddrb, r16

Du Deklarierst PORTD als Ausgang und PORTB als Eingang. Überprüf am
besten mal, ob das so stimmt.

Ansonsten solltest du lieber Timer für dein Lauflicht verwenden. Sieht
besser aus und du sparst dir die Schleifen. Dann kannst du auch das
Timing leichter verändern.

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Delays:
Grund-Delay ca. 0.64msec:
.equ Speed=32  ;  8 = 1MHz; 16 = 2MHz; 32 = 4MHz; 64 = 8MHz; 
      ;128 = 16MHz; 160 = 20MHz

DELAY:
  push R16      ;Warteschleife
  ldi R16, Speed  ;Anzahl Durchläufe, siehe ganz oben
DELAY_AGAIN:
  dec R16      ;Durchläufe -1
  nop          ;Bremse
  nop
  nop
  tst R16
  brne DELAY_AGAIN  ;Abgelaufen? Dann raus
  pop R16
  ret

Zweite Stufe 100msec:
Delay100:
  push R16
  ldi R16,100
Delay100_A:  
  rcall Delay
  dec R16
  cpi R16, 0
  brne Delay100_A
  pop R16
  ret
Dritte Stufe 500msec:
Delay500:
  push R16
  ldi R16,10
Delay500_A:  
  rcall Delay100
  dec R16
  cpi R16, 0
  brne Delay500_A
  pop R16
  ret
So, damit hast du gleich drei universelle Delays
Speed entsprechend setzen, dann stimmen die angegebenen Zeiten.

Schalterabfrage ist ok, der Schalter wird direkt zwischen Controllerpin
und Masse gelegt, der 10kOhm-Widerstand kommt direkt zwischen
Controllerpin und 5Volt.

Gruss
Jadeclaw.

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man kann am AVR eingangspin auch den internen pullup anschalten (im Port
register eine 1 schreiben) dann sparst du dir den widerstand ganz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.