Alter Neuer

dschi dschei

Neues Mitglied
22. Juni 2009
6
0
0
Sprachen
Hallo allerseits,

ich bin "verhinderter Elektroniker" mit teilweise fundiertem Halbwissen.
Bin schon öfter mal im I-Net und auch sonst mal auf µC,s gestossen,
hat mich aber nie sonderlich gefesselt.
In letzter Zeit überkommt mich aber immer häufiger der Wunsch mich mit µC's
zu befassen. Ganz offen gesagt habe ich aber Null Wissen von diesen Dingern.:hmmmm:
Daher schon im Voraus die Bitte, ungewöhnlich doof klingende Fragen zu entschuldigen.
Am besten fang ich gleich mit so einer an.
Also, was genau passiert eigentlich bei der Programmierung bzw. während dem laufendem Programm
in so nem schwarzen Ding?
Werden bei der Programmierung die Register mit Nullen und Einsen "gefüllt"
und dann im laufendem Programm werden ständig die Ein- und Ausgänge, Flags, Carries, Interrupts ...
überwacht, Stack geladen usw.und je nach Zustand dieser Bits, Bytes oder Words...werden dann die
Ausgänge entsprechend geschalten (ähnlich wie bei einer SPS)?
Oder wie läuft das ab?
Wenn mir das jemand erklären könnte, wär ich sehr dankbar.

Gruß dschi dschei
 
Hallo,

herzlich willkommen ! :flowers:

In letzter Zeit überkommt mich aber immer häufiger der Wunsch mich mit µC's
zu befassen. Ganz offen gesagt habe ich aber Null Wissen von diesen Dingern.:hmmmm:
das wird ne harte Nuß :rolleyes: :eek:

Also, was genau passiert eigentlich bei der Programmierung bzw. während dem laufendem Programm
in so nem schwarzen Ding?
Werden bei der Programmierung die Register mit Nullen und Einsen "gefüllt"
und dann im laufendem Programm werden ständig die Ein- und Ausgänge, Flags, Carries, Interrupts ...
überwacht, Stack geladen usw.und je nach Zustand dieser Bits, Bytes oder Words...werden dann die
Ausgänge entsprechend geschalten (ähnlich wie bei einer SPS)?
Oder wie läuft das ab?
Wenn mir das jemand erklären könnte, wär ich sehr dankbar.
auweia ... das wird aber nen Roman von 500 Seiten (mindestens :D ;) )

Das ist mit ner SPS eigentlich weniger zu vergleichen. Ne SPS rotiert
(nach meinen Kenntnissen) immer durch und simuliert Logik-Glieder.
Nen AVR kann man eher mit nem PC vergleichen der auch mal zwischendurch
im Programm auf was wartet und dann eben nix tut.

Das Flash kann man mit der Festplatte vergleichen (das Betriebssystem),
das EEPROM evtl mit dem CMOS-Baustein (BIOS-Einstellungen) des PC.
Das SRAM erklärt sich von selber (RAM des PCs).
Die ganzen IO-Leitungen sind eher mit dem Tastatur-/Maus-/Drucker-/...
-Anschlüssen des PCs zu vergleichen.
Das sind aber alles nur sehr grobe Vergleiche.

Das Programm was Du schreibst wird vom Programmer (zB AVRISPmkII) in das
Flash geladen. Nach der Programmierung rennt der Prozessor dann los und
führt das Programm aus. Genau so wie zB der PC sein Windows/DOS/Linux.

Im Programm wartet man dann zB auf bestimmte Signale an den Anschlüssen
oder wandelt eine Spannung mit dem Analog-Digital-Wandler (ADC) in einen
Digitalwert. Oder man mißt eine Frequenz oder was auch immer. Mit den
eingelesenen Werten kann man dann zB nach der Verarbeitung an den
Ausgängen (die man sich definiert hat) Spannungen erzeugen, Relais schalten,
Motoren steuern, LED/LCDs ansteuern, Daten per RS232 zum PC senden, ...

Es ist also ein richtiger kleiner Computer den du dann vor dir hast.

Die IOs, Bytes, ... werden nur an den Stellen im Programm verarbeitet an
denen du das programmiert hast. Du rennst ja auch nicht dauernd durchs
Haus und machst 75 Sachen gleichzeitig :D Alles eins nach dem anderen.
Und wenn das Telefon klingelt hast Du einen Interrupt :eek: ;)

Sieh dir mal folgendes an ...

- Wie funktioniert die CPU

Der AVR hat das Programm im Flash und die Daten im SRAM. Also ...
- Harvard Architektur
Mit der von-Neumann Architektur hat man Daten und Programm in einem
gemeinsamen Speicher.

- Microcontroller (Wikipedia)

- Mikrocontroller (Mikrocontrolleer.net)

- Flash-Speicher

- EEPROM-Speicher

Das Herz des Prozessors ...
- Arithmetisch-logische Einheit (ALU)

- Prozessor (Hardware)

Über den internen Aufbau (ALU,Register,Flags) hab ich leider nichts wirklich
gut verständliches und bebildertes gefunden.
Dieses hier ...
Aufbau und Funktion einfacher Mikroprozessoren und Mikrocontroller
scheint noch am ehesten was herzugeben.

Ich hoffe mal, ich schrecke dich mit den ganzen Links nicht ab :eek: ...
Aber um alles hier zu erklären ist es einfach zu viel. Dir in Teilbereichen
und Verständnisproblemen auf die Sprünge zu helfen sollte aber wohl gehen.
Also einfach weiter fragen wenn es Probleme gibt.

Wenn du verstehen willst wie die CPU wirklich arbeitet mußt du in Assembler
programmieren. Das ist aber für Einsteiger ein harter Weg. Wenn du schnelle
Erfolge haben möchtest dann nimm Bascom. Dadurch wirst du dann aber
evtl später die Probleme mit dem Verständnis der internen Abläufe haben und
warum etwas funktioniert oder ebend nicht. Wenn jemand noch nie was mit
Prozessoren/Microcontrollern gemacht hat, ist das über ein "Forums-
Fernstudium" nicht ganz einfach ;)

Gruß
Dino
 
Hallo Dschi_Dschei !

Auch von mir ein herzliches Willkommen im Forum! :ciao:


Die Sache mit der "null Ahnung" werden wir hier wohl ein wenig in Griff bekommen.
Ich welcher Sprache möchtest du denn später mal programmieren?
ASM, C, BASCOM?

Kannst du mir vielleicht bei Gelegenheit noch erklären, was ein "verhinderter Elektroniker" mit fundiertem Halbwissen ist? :hmmmm: :)


Schöne Grüße,
Cassio
 
Hallo dino03,

danke für die rasche Antwort.

Ich fürchte, ich habe mich nicht genügend klar ausgedrückt.
Das Einlesen in die Materie ist nicht die allergrößte Hürde, da
kann ich schon ganz schön hartnäckig sein.:banghead:
Ich würde gerne verstehen, wie man im Editor ein Programm schreibt.
Wenn ich z.B. will, dass Ausgangsbit 6 von 0 auf 1 gesetzt wird nachdem
am Eingangsport ein oder mehrere Bits ihren Zustand geändert haben,
müssen die Eingänge dann dauernd überwacht werden, oder macht der µC
solange nichts, bis am Eingangsport irgendeine Änderung des momentanen
Zustandes eintritt?
Z.B. Eingangsbit 4 ändert seinen Zustand von 0 nach 1
oder umgekehrt. Wenn diese Bedingung eintritt, dann wird Register 18 geladen.
Wenn Register 18 mit dem derzeitigen Zustand des Eingangsports übereinstimmt,
wird Ausgangsbit 6 gesetzt?
Diese Vorstellung ist vermutlich total daneben, aber ich hoffe, dass damit
klarer wird, was ich meine.:hmmmm:

Danke nochmal

Gruß dschi dschei
 
Hallihallo.
Ich bin auch noch ganz neu in dieser Materie, obwohl ich das Exp.
Board schon ne Weile hatte.

Das Problem ist das man ohne konkrete Anwendung meiner Meinung
nichts lernen kann.
Im Roboternetz und dergleichen zu lesen bringt mir sehr wenig,
da mir das meist zu theoretisch ist und an Stellen Ansetzt die
mir schon zu hoch sind.

Am besten man hat eine Idee und setzt die um. Aber nicht
gleich das schwerste.
Obwohl hier eine Anwendung schon gut läuft sind einige Begriffe
noch dunstig. Bootloader, EEPROM, interrupts, PWM.

Kommt noch...

Gruss, Andreas
 
Hallo Cassio,

danke für die freundliche Begrüßung.
(auch @ dino03, sorry hatte ich vergessen).

Ich möchte in ASM programmieren, so Gott will.:eek:

Naja, ein verhinderter Elektroniker ist einer der
schon vieles gelesen und sich mit dem einen oder
anderen elektronischen Teil schon gespielt hat, der
gerne "richtiger" Elektroniker geworden wäre, für den
es sich aber nicht mehr rentiert, weil zu alt.:(

Gruß

dschi dschei
 
Hallo,

Ich möchte in ASM programmieren, so Gott will.:eek:
also richtig ins eingemachte und die Innereien kennenlernen :D

Naja, ein verhinderter Elektroniker ist einer der
schon vieles gelesen und sich mit dem einen oder
anderen elektronischen Teil schon gespielt hat, der
gerne "richtiger" Elektroniker geworden wäre, für den
es sich aber nicht mehr rentiert, weil zu alt.:(
naja, zu alt ? Ich glaube, wir haben hier auch irgendwo nen ca 60jährigen im
Forum rumwuseln ;) Alter ist immer relativ :D

Zu dem mit dem "Port abfragen und danach ne LED setzen" ...

das Bruchstück sieht in Assembler in etwa so aus ...


CodeBox ASM

; === Alle Bits vom Port B einlesen und auf Port C wieder ausgeben ===

ldi r16,0x00 ; Wert für Port B - alles Eingänge
out DDRB,r16 ; und setzen

ldi r16,0xFF ; Wert für Port C - alles Ausgänge
out DDRC,r16 ; und setzen

hauptschleife: ; Sprunglabel für die Hauptschleife

in r16, PINB ; Port B in Register r16 laden
out PORTC,r16 ; Bit-Sustände von Port B (ist ja in r16) zum Port C übernehmen

rjmp hauptschleife ; und rotieren lassen


nochn Gedicht ;) (frei nach Heinz Erhard)


CodeBox ASM

; === Bit 4 von Port B einlesen und auf Bit 6 von Port C ausgeben ===
; Ohne Benutzung eines Register in der Hauptroutine ;-)
; sbis => Skip if Bit in I/O-Register is Set
; sbic => Skip if Bit in I/O-Register is Cleared
; sbi => Set Bit in I/O-Register
; cbi => Clear Bit in I/O-Register

ldi r16,0x00 ; Wert für Port B - alles Eingänge
out DDRB,r16 ; und setzen

ldi r16,0xFF ; Wert für Port C - alles Ausgänge
out DDRC,r16 ; und setzen

hauptschleife: ; Sprunglabel für die Hauptschleife

sbis PINB,4 ; nächsten Befehl bei PB4=1 überspringen
cbi PORTC,6 ; wenn also PB4=0 dann PC6=0 setzen (clear)

sbic PINB,4 ; nächsten Befehl bei PB4=0 überspringen
sbi PORTC,6 ; wenn also PB4=1 dann PC6=1 setzen (set)

rjmp hauptschleife ; und rotieren lassen


und ein wenig toggeln ...


CodeBox ASM

; === Bit 4 von Port B einlesen und Bit 6 von Port C bei positiver Flanke toggeln ===
; sbr => Set Bit in Register
; cbr => Clear Bit in Register

ldi r16,0x00 ; Wert für Port B - alles Eingänge
out DDRB,r16 ; und setzen

ldi r16,0xFF ; Wert für Port C - alles Ausgänge
out DDRC,r16 ; und setzen

; definierte Registerinhalte erzeugen
ldi r16,0x00 ; hier lesen wir den PortB rein
ldi r17,0x00 ; und hier speichern wir den alten Portwert für den nächsten Durchlauf
hauptschleife: ; Sprunglabel für die Hauptschleife

in r16,PINB ; Port B einlesen

; Hier testen wir ob PB4=1 ist. Dann könnte eine positive Flanke (0->1)
; aufgetreten sein (könnte!)
sbrs r16,4 ; nächsten Befehl bei r16.4=1 überspringen (also bei PB4=1)
rjmp keintoggel ; Springen wenn PB4=0 ist

; jetzt sehen wir nach ob beim letzten Schleifendurchlauf PB4=0 war.
; wenn ja, dann war das ein Wechsel von 0 auf 1 (positive Flanke)
sbrc r17,4 ; alte Wert von r16.4=0 ? dann überspringen
rjmp keintoggel ; springe wenn letztes Mal PB4=1 war

; wir fragen den aktuell gesetzten Port-Zustand ab und ändern ihn
sbic PORTC,6 ; nächsten Befehl bei PC6=0 überspringen
rjmp pc6isthigh ; also ist PC6=1

; PC6=0 also toggeln wir ... PC6 wird dann 1 gesetzt
sbi PORTC,6 ; wenn also PC6=0 dann PC6=1 setzen (set)
rjmp keintoggel ; und toggeln-Ende

pc6isthigh: ; PC6 ist 1 also toggeln wir ... PC6 wird dann 0
cbi PORTC,6 ; wenn also PC6=1 dann PC6=0 setzen (clear)

keintoggel: ; Sprungmarke für PB4=0 oder keine possitive Flanke
; oder Toggeln beendet

mov r17,r16 ; r16 nach r17 kopieren (alter Wert für nächsten Durchlauf)
rjmp hauptschleife ; und rotieren lassen


Ich hoffe mal, ich hab in die Beispiele (vor allem das letzte) keine Böcke
reingebaut ;) Die sind gerade so im Kopf enntstanden und ohne Test auf
einer Hardware. Beim letzten Beispiel (toggeln bei positiver Flanke) muß man
sich den Ablauf schon ein wenig auf der "Zunge zergehen lassen" :D

Das sind natürlich jetzt nur die reinen Assembler-Routinen ohne die Definition
des Prozessortyps oder anderes Beiwerk (also das .include "m32def.inc" , .org ...
oder so etwas).

Viel Spaß beim knobeln ;)

Gruß
Dino
 
Hallo und herzlich willkommen,

würde mich gerne dazu gesellen, weil ich mitte Juli meine Meiseterprüfung schreibe und wir sollen was in ASM programmieren.


wie siehts aus kann man ein kleinen Kurs anfangen?

meine Exp. Boards sind ein mega8 und mega128 mit dazu gehörigen zusatzkomponenten (rs232, I2C, usw.)


würde mich sehr freuen wenns klappt
 
Hallo,

würde mich gerne dazu gesellen, weil ich mitte Juli meine Meiseterprüfung schreibe und wir sollen was in ASM programmieren.
tatsächlich in Assembler ? :)
nicht in Java oder c# oder .NET oder irgendeinem anderen hochtrabenden
objektorientierten Gelumpe ? :D :D
Aber Mitte Juli ist echt verdammt eng :eek:

wie siehts aus kann man ein kleinen Kurs anfangen?
hätte ich nix dagegen :) Können wir ja im Bereich "Software" was starten ...
paßt dort glaube ich am besten.

meine Exp. Boards sind ein mega8 und mega128 mit dazu gehörigen zusatzkomponenten (rs232, I2C, usw.)
Mit I2C steh ich noch ein wenig auf Kriegsfuß aber das sollte ja auch nicht
so schwer sein, den Mist zum laufen zu bringen. Kann man ja mal mit nem
I2C-IO-Baustein anfangen. Der sollte wohl noch am einfachsten sein
(PCF8574 heißt das Ding) am Uhrenbaustein (PCF8583) bin ich gescheitert :( .

Gruß
Dino
 
Ein Assemblerkurs starte ich auch gerade auf meiner Internetseite. Später wird es auch einen umfangreichen Lehrgang für IIC/TWI geben.

Ich verwende IIC sehr gerne.
 
Hallo,

Ein Assemblerkurs starte ich auch gerade auf meiner Internetseite. Später wird es auch einen umfangreichen Lehrgang für IIC/TWI geben.

Ich verwende IIC sehr gerne.
Du bist mein Mann :rolleyes: Sach mir wie ich in Assembbler die RTC PCF8583
mit der Hardware-TWI des ATmega bearbeiten kann :D :D
Ich krieg da trotz laufender Kommunikation keine vernünftigen Daten zurück
und das Programm frißt sich dann in den Routinen fest weil es auf Antwort
vom PCF8583 wartet (alles mit Polling). Da müssen wir uns wohl mal
zusammensetzen :D ;)

Gruß
Dino
 
Es ist nur ein Teil der Meisterprüfung wenn ich den halt verhau ist es nicht so schlimm.

Es wird nur mit dem mega alleine gearbeitet keine Zusatzkomponenten,
also reine ein- ausgabe der eingänge.

In der letzten Meisterprüfung sollte man eine Lautsprecherumschaltung bauen, aber so das jedes mal der Verstärker Ausgang immer mit 8 ohm belastet ist, der Verstärker sollte 5-6 Räume beschallen

sowas in der richtung

@TKRoth

wie heisst denn deine Seite?
 
Gib mir doch mal Schaltplan und Programm ... Schaue mir das mal an :)
hier im Forum, bei den Projekten ...
ATmega32-Board für Steueraufgaben und Experimente
da sind auch die Pläne und der letzte Code davon drin. Hat jetzt aber schon
ein "paar Tage" auf dem Buckel ;) Danach ist der TWI/1Wire-Analyzer
entstanden, an dem ich auch noch dran bin und als letztes das ASCII-Terminal.
Also sind im Moment 3 Projekte offen :D :rolleyes:
Evtl findest Du ja irgendeinen blöden Fehler den ich immer übersehen habe :eek:
Wenn nicht ist es aber auch nicht schlimm. Ich werde wohl die nächste Zeit
dann mal mein STK500 voll in Betrieb nehmen und da kann ich dann ja alles
mögliche testen und nochmal von Grund auf sauber machen ;)

Gruß
Dino
 
Hallo dino03,

vielen Dank für die prompte Antwort.

Muß deinen Ausführungen erst mal gestatten sich in meinem Gehirn
auszubreiten. Momentan leider nicht mehr möglich!
Kann heute nicht mehr klar denken, brauche ne Mütze voll Schlaf.
Melde mich morgen wieder:goodnight:

Gruß dschi dschei
 
Hallo dino03,

bin wieder halbwegs fit.:)
Diese drei Routinen die Du mir da geschickt hast sind ja richtig toll!
Anfangs verstand ich wirklich nur Bahnhof, aber nach mehrmaligem Durchlesen,
denke ich, dass ich das sogar halbwegs begriffen habe. Ich musste zwar schon
um einige Ecken denken, aber ich glaube es wird heller, wenn auch nicht ganz.
Daher habe ich noch ein paar Fragen und bitte Dich um eine so gut verständliche
Antwort, wie die Erklärung bei den Befehlen (Kommentare)

1.kann jeder Port (A bis D) als Ein- oder Ausgangsport benutzt bzw. definiert werden
und wenn ja, woher "weiß" der µP dann welcher Port ein Ein- oder Ausgang ist?
Das muss man ihm doch irgendwie mitteilen, oder?

2.Was bedeutet DDRx (Data Direction Register), wird damit irgendwie festgelegt,
ob das ein Aus- oder Eingang ist?

3.bei allen 3 Beispielen die Du mir geschickt hast, steht:

(1) ldi r16,0x00 ; Wert für Port B - alles Eingänge
(2) out DDRB,r16 ; und setzen

(3) ldi r16,0xFF ; Wert für Port C - alles Ausgänge
(4) out DDRC,r16 ; und setzen

Das bedeutet doch für:

(1) Wert 0d wird in Register 16 geschrieben
(2) Alle Bits von Port B werden auf 0 gesetzt (was bedeutet hier DRB?)
(3) Wert 255d wird in Register 16 geschrieben
(4) Alle Bits von Port C werden auf 1 gesetzt (was bedeutet hier DRC?)

Das würde heißen, wenn an Port C 8 LED's hängen leuchten die alle auf,
sofern nicht eine negierte Logik dazwischen hängt. Und es ist besser,
wenn man das so macht, weil wenn alle Bits von Port C = 0 wären,
weiß man nicht ob die LED's kaputt sind oder ein Ausgangsbit nicht geschaltet hat, oder?

Also nochmal vielen Dank für Deine Mühe:adore:

Gruß dschi dschei

PS: Könntest Du ein STK 500 für einen blutigen Anfänger wie mich
empfehlen und wenn ja, benötigt man da noch Zubehör?
 
Hallo

Nun,
meinst Du den (fast) 60-jährigen?
OK.
Melde mich zur Stelle.


Hier die Antwort auf die konkrete Frage:

Ports sind einmal vordefiniert für Standardaufgaben.
Hier mal in die Datenblätter reinschauen.

Zum andern konnen sie auch in gewissen Grenzen frei
als Ausgänge oder Eingänge und zwar Port-Bit-weise
konfiguriert werden.

Das ist heftig.
Schluck- schluck (mein oller 8051er erblaßt vor Neid)


Dazu gibt es Datenrichtungsregister für jeden Port DDRA für Port A
DDRB für Port B.
Diese können nicht direkt beschrieben werden, nur über den Umweg
Lade Wert in Temporärregister und dann Temporärregisterweret in Datenrichtungsregister.

Gruß von Oskar01

(Nun ´dürfen die jüngeren Kollegen sich weiter austoben.)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)