Forum: Mikrocontroller und Digitale Elektronik ATmega128 und LEDs bzw Schalter


von Andreas B. (loopy83)


Angehängte Dateien:

Lesenswert?

Hallo,

ich arbeite derzeit mit einem uC... es ist ein ATmega128.

Arbeiten heißt, dass ich die Hardware für einen Kumpel baue/vorbereite, 
aber leider keinen blassen Schimmer habe, wie ich testen soll, ob meine 
Hardware auch funktioniert. Mein Kumpel ist auch gerade im Urlaub und 
nach seiner Rückkehr wollte er eigentlich loslegen. Da ich aber ungern 
in Griechenland anrufen will um das zu klären, frage ich hier nach.

Ich kann den Controller ansprechen (connect via AVR Studio, mkII und 
ISP) und habe auch schon den externen 10MHz Kristall via Fuses aktiviert 
und er schwingt auch.

Nun will ich ein kleines simples Programm testen.

Da ich mich mit Programmierung noch nie groß auseinandergesetzt habe 
(nur die Grundlagen im Studium), habe ich an vier LEDs und einen 4fach 
Dipschalter gedacht.
Nun möchte ich einfach mit jedem Dip eine LED aus- oder anmachen... mehr 
nicht.

Die LEDs hängen an PD4/5/6/7 und die Dipschalter hängen an PD0/1/2/3. 
Schaltplan siehe Bild im Anhang.

Wie kann ich ein solches Programm umsetzen?
Ich hab kurz das Tut überflogen, aber das ist mir schon wieder alles zu 
theoretisch. Hätte mir es irgendwie einfacher vorgestellt, als ich 
gesagt habe, dass ich eine funktionsfähige Platine versprochen habe. Die 
Wette möchte ich auch nur ungern verlieren :)

Wäre für Hinweise und Hilfe sehr sehr dankbar!

MfG

PS: Ich habe das Bsp im Tut gelesen
1
.include "m8def.inc"
2
 
3
         ldi r16, 0xFF
4
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
                           ; Richtungsregister DDRB als Ausgang konfigurieren
6
         ldi r16, 0x00
7
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
                           ; Richtungsregister DDRD als Eingang konfigurieren
9
loop:
10
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
11
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
12
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife
Hier werden komplette Porst definiert, aber wie kann ich die einzelnen 
Ein-/Ausgände des POrtD ansprechen bzw. festlegen?
Ausgänge => PD4, PD5, PD6, PD7
EIngänge => PD0, PD1, PD2, PD3

: Verschoben durch User
von Andreas B. (loopy83)


Lesenswert?

Ergibt das soweit Sinn?
Das Tutorial ist ja für den ATmega8 geschrieben. Kann ich die Zeile 
.include "m8def.inc" auch für den 128er verwenden?
1
.include "m8def.inc"
2
 
3
         ldi r16, 0xFF
4
         out DDRD4, r16     
5
6
     ldi r16, 0xFF
7
         out DDRD5, r16
8
9
     ldi r16, 0xFF
10
         out DDRD6, r16
11
     
12
     ldi r16, 0xFF
13
         out DDRD7, r16
14
15
16
         ldi r16, 0x00
17
         out DDRD0, r16     
18
19
     ldi r16, 0x00
20
         out DDRD1, r16
21
22
     ldi r16, 0x00
23
         out DDRD2, r16
24
25
     ldi r16, 0x00
26
         out DDRD3, r16
27
28
loop:
29
         in r16, PIND0
30
         out PORTD4, r16    
31
     
32
     in r16, PIND1
33
     out PORTD5, r16
34
     
35
     in r16, PIND2
36
     out PORTD6, r1      
37
     
38
     in r16, PIND3
39
     out PORTD7, r1
40
41
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife

DANKE!

von Alexander B. (esquilax)


Lesenswert?

Hat es einen bestimmten Grund, warum du dir das Assembler-Tut angeschaut 
hast?
Ich empfehl dir das C-Tut anzuschauen. Ist wahrscheinlich einfacher. 
Vermutlich hast du im Studium auch eher eine Hochsprache verwendet?!

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wir sind hier im GCC Forum, also Programmierung in C mit der GNU 
Compiler Suite. Daher:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  // Initialisierung Hardware
6
  DDRD = 0xF0; // PD7-PD4 Ausgang und PD3-PD3 Eingang
7
8
  // endlose Arbeitsschleife
9
  while(1)
10
  {
11
    // Ausgang = Eingang
12
    // LED und Schalter beide low aktiv
13
    PORTD = PIND << 4; 
14
  }
15
}

von Andreas B. (loopy83)


Lesenswert?

Ich habe auch Assembler programmiert im Studium... finde ich irgendwie 
übersichtlicher und einfacher. Wiel alles Schritt für Schritt 
abgearbeitet wird.... das C Tut finde ich schon wieder zu komplex. Da 
gehts dann los mit Prozessortyp und include dies und jenes... da komm 
ich nicht mit.

Gibt es vielleicht ein Bps, was die gewünschte Aufgabe erfüllt und ich 
es nur auf meinen Controller anpassen muss?

Wie gesagt, ich will mich nicht weitgehend damit auseinander setzen... 
ich brauch es nur für Testzwecke.

von SF (Gast)


Lesenswert?

1
.include "m128def.inc"      ;µC ist der mega128
2
 
3
         ldi  r16, 0xF0     
4
         out  DDRD, r16     ; Pins 4-7 am Port D als Ausgang konfigurieren
5
                            ; Pins 0-3 am Port D als Eingang konfigurieren
6
7
loop:
8
         in   r16, PIND     ; an Port D anliegende Werte (Taster) nach r16 einlesen
9
         swap r16           ; in r16 bits 0-3 mit bits 4-7 vertauschen
10
         andi r16, 0xF0     ; nicht benötigte bits 0-3 löschen
11
         out  PORTD, r16    ; Inhalt von r16 an Port D ausgeben
12
         rjmp loop          ; Sprung zu "loop:" -> Endlosschleife

Das könnte funktionieren. Ist aber ungetestet, da ich sowas auch eher in 
C machen würde anstatt in Assembler. Es wird vorrausgesetzt, das die 
LEDs an GND verschaltet sind. Ausgabe ist sonst invertiert.

von Peter (Gast)


Lesenswert?

ich finde gute das leute mit ASM anfangen, es schafft erstmal gutes 
Vorwissen. Wenn es Komplexer wird kann man ja gerne auf C umsteigen.

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.