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


von Tobias (Gast)


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

von Christian Rötzer (Gast)


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?

von Tobias (Gast)


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

von Florian M. (----florian----)


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

von Tobias (Gast)


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

von Florian M. (----florian----)


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

von Tobias (Gast)


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

von Läubi (Gast)


Lesenswert?

die 10kohm muessen gegen +5V!

von Läubi (Gast)


Lesenswert?

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

von Tim Günther (Gast)


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.

von Jadeclaw D. (jadeclaw)


Lesenswert?

Delays:
Grund-Delay ca. 0.64msec:
1
.equ Speed=32  ;  8 = 1MHz; 16 = 2MHz; 32 = 4MHz; 64 = 8MHz; 
2
      ;128 = 16MHz; 160 = 20MHz
3
4
DELAY:
5
  push R16      ;Warteschleife
6
  ldi R16, Speed  ;Anzahl Durchläufe, siehe ganz oben
7
DELAY_AGAIN:
8
  dec R16      ;Durchläufe -1
9
  nop          ;Bremse
10
  nop
11
  nop
12
  tst R16
13
  brne DELAY_AGAIN  ;Abgelaufen? Dann raus
14
  pop R16
15
  ret

Zweite Stufe 100msec:
1
Delay100:
2
  push R16
3
  ldi R16,100
4
Delay100_A:  
5
  rcall Delay
6
  dec R16
7
  cpi R16, 0
8
  brne Delay100_A
9
  pop R16
10
  ret
Dritte Stufe 500msec:
1
Delay500:
2
  push R16
3
  ldi R16,10
4
Delay500_A:  
5
  rcall Delay100
6
  dec R16
7
  cpi R16, 0
8
  brne Delay500_A
9
  pop R16
10
  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.

von Lupin (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.