mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128 und LEDs bzw Schalter


Autor: Andreas B. (loopy83)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
.include "m8def.inc"
 
         ldi r16, 0xFF
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
                           ; Richtungsregister DDRB als Ausgang konfigurieren
         ldi r16, 0x00
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
                           ; Richtungsregister DDRD als Eingang konfigurieren
loop:
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
         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 Moderator
Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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?
.include "m8def.inc"
 
         ldi r16, 0xFF
         out DDRD4, r16     

     ldi r16, 0xFF
         out DDRD5, r16

     ldi r16, 0xFF
         out DDRD6, r16
     
     ldi r16, 0xFF
         out DDRD7, r16


         ldi r16, 0x00
         out DDRD0, r16     

     ldi r16, 0x00
         out DDRD1, r16

     ldi r16, 0x00
         out DDRD2, r16

     ldi r16, 0x00
         out DDRD3, r16

loop:
         in r16, PIND0
         out PORTD4, r16    
     
     in r16, PIND1
     out PORTD5, r16
     
     in r16, PIND2
     out PORTD6, r1      
     
     in r16, PIND3
     out PORTD7, r1

         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife 

DANKE!

Autor: Alexander B. (esquilax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir sind hier im GCC Forum, also Programmierung in C mit der GNU 
Compiler Suite. Daher:

#include <avr/io.h>

int main(void)
{
  // Initialisierung Hardware
  DDRD = 0xF0; // PD7-PD4 Ausgang und PD3-PD3 Eingang

  // endlose Arbeitsschleife
  while(1)
  {
    // Ausgang = Eingang
    // LED und Schalter beide low aktiv
    PORTD = PIND << 4; 
  }
}


Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m128def.inc"      ;µC ist der mega128
 
         ldi  r16, 0xF0     
         out  DDRD, r16     ; Pins 4-7 am Port D als Ausgang konfigurieren
                            ; Pins 0-3 am Port D als Eingang konfigurieren

loop:
         in   r16, PIND     ; an Port D anliegende Werte (Taster) nach r16 einlesen
         swap r16           ; in r16 bits 0-3 mit bits 4-7 vertauschen
         andi r16, 0xF0     ; nicht benötigte bits 0-3 löschen
         out  PORTD, r16    ; Inhalt von r16 an Port D ausgeben
         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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.