Forum: Mikrocontroller und Digitale Elektronik Absoluter Neuling, Einstiegsfragen.


von Lukas S. (lukas74)


Lesenswert?

Hallo zusammen:)
Also ich kenne mich zwar gut mit Elektrotechnik aus, gehe aber momentan 
meine ersten Schritte in der Mikrocontroller Programmierung. Also ich 
kann mit der Logo programmieren falls das jemandem was sagt, aber das 
ist ja nicht so wirklich anspruchsvoll:D
Ich kann ein wenig in c++ programmieren aber mein Lehrer meinte ich soll 
lieber mit Assembler anfangen, ist das ratsam?
Gibt es ansonsten grundlegenede Sachen die ich wissen sollte?
Jeder Rat wäre echt nett danke:)
Werde mir auch noch das Tutorial durchlesen, aber es wäre schön vllt ein 
paar grundlegende sachen so gesagt zu bekommen:)

von dirk l. (super8film)


Lesenswert?

zu deiner frage steht sogar was im AVR Tutorial.

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

"Warum ist dieses Tutorial für Assembler geschrieben, wo es doch einen 
kostenlosen C-Compiler (WinAVR, AVR-GCC) und einen billigen 
Basic-Compiler gibt?

Assembler ist für den Einstieg "von der Pike auf" am besten geeignet. 
Nur wenn man Assembler anwendet, lernt man den Aufbau eines 
Mikrocontrollers richtig kennen und kann ihn dadurch besser nutzen; 
außerdem stößt man bei jedem Compiler irgendwann mal auf Probleme, die 
sich nur oder besser durch das Verwenden von Assemblercode lösen lassen. 
Und sei es nur, dass man das vom Compiler generierte Assemblerlisting 
studiert, um zu entscheiden, ob und wie man eine bestimmte Sequenz im 
C-Code umschreiben soll, um dem Compiler das Optimieren zu 
ermöglichen/erleichtern. ....."

von ucWriter (Gast)


Lesenswert?

Also ich würde mit C anfangen. Das ist leichter. Assembler würde ich nur 
dann einsetzen, wenn ich absolut zeitkritische Sachen programmieren 
müsste; man muss allerdings gut Assembler können, um die 
Optimiererstrategien der C-Compiler zu schlagen.

von gordon51freeman (Gast)


Lesenswert?

Ja ist eigentlich schon so: Wenn du in kurzer Zeit einiges erreichen 
willst, lern C. Wenn du aber die Grundlagen lernen willst und es dir 
nichts ausmacht, wenn du mal 'ne Woche für ein Lauflicht z.B. brauchst 
dann lern Assembler :)

Die Qual der Wahl, nicht wahr?

von Alex (Gast)


Lesenswert?

;;**********************************************************************
;   Dateiname: led_on-1.asm
;**********************************************************************
;   Dateibeschreibung:
;
;**********************************************************************
;   Dateihistorie:
;   Ver      Datum          Autor            Bemerkung
;
;   1.02     20.10.09      Alex Schndeider
;
;**********************************************************************
;**********************************************************************
;---------- Includedateien ------------------------------
#include <P16f84A.INC>  ; Includefile for P16F84A

;**********************************************************************
;---------- Konfiguration ------------------------------
; bis 4 MHz: Power on Timer, no Watchdog, XT-Oscillator
  __CONFIG  _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

   processor pic16f877a


;Variablen
ZAEHL1                equ 0x20        ; Hilfsvariable für Warte-Routine
ZAEHL2                equ 0x21        ; Hilfsvariable für Warte-Routine
ZAEHL3                equ 0x22        ; Hilfsvariable für Warte-Routine
Save                  equ 0x23        ; zum Zwischenspeichern

s                     equ 0x24        ; Sekunden
m                     equ 0x25        ; Minuten
h                     equ 0x26        ; Stunden
byte                  equ 0x27        ; umzuwandelndes Byte
e                     equ 0x28        ; Einerstelle in ASCII
z                     equ 0x29        ; Zehnerstelle in ASCII

;Konstanten
LCDPort               equ PORTB
Enable                equ 0x3
RW                    equ 0x2
RS                    equ 0x1

        org 0x00

RESET:                clrf    STATUS
                      movlw   0x00
                      movwf   PCLATH
                      goto    main

        org 0x10

;------------------------------------------------------------------
;Warte-Routine 15,6 ms bei 8 MHz
wait15ms:             movlw   d'132'
                      movwf   ZAEHL1
                      movlw   d'41'
                      movwf   ZAEHL2
tloop15ms:
                      decfsz  ZAEHL1,F
                      goto    tloop15ms
                      decfsz  ZAEHL2,F
                      goto    tloop15ms
                      return
;-------------------------------------------------------------------
;Warte-Routine 4,2 ms bei 8 MHz
wait4ms:
                      movlw   d'232'
                      movwf   ZAEHL1
                      movlw   d'11'
                      movwf   ZAEHL2
tloop4ms:
                      decfsz  ZAEHL1,F
                      goto    tloop4ms
                      decfsz  ZAEHL2,F
                      goto    tloop4ms
                      return
;--------------------------------------------------------------------
;Warte-Routine 2ms bei 8 MHz
wait2ms:
                      movlw   d'48'
                      movwf   ZAEHL1
                      movlw   d'6'
                      movwf   ZAEHL2
tloop2ms:
                      decfsz  ZAEHL1,F
                      goto    tloop2ms
                      decfsz  ZAEHL2,F
                      goto    tloop2ms
                      return
;----------------------------------------------------------------------
;Warte-Routine 100us bei 8 MHz
wait100us:
                      movlw   d'65'
                      movwf   ZAEHL1
                      movlw   d'1'
                      movwf   ZAEHL2
tloop100us:
                      decfsz  ZAEHL1,F
                      goto    tloop100us
                      decfsz  ZAEHL2,F
                      goto    tloop100us
                      return
;-----------------------------------------------------------------------
; Warte-Routine 41us bei 8 MHz
wait40us:
                      movlw   d'27'
                      movwf   ZAEHL1
tloop40us:
                      decfsz  ZAEHL1,F
                      goto    tloop40us
                      return
;----------------------------------------------------------------------- 
-
; Inhalt von w an LCD senden (C - Control, Kommando)
LCDsendC:
                      movwf   Save          ; bewahrt das ankommende 
Byte auf
                                         ; obere Hälfte
                      call    LCDsndI       ; LCDsndI erledigt die 
Maskierung
                      call    wait40us      ; 40us warten
                                         ; untere Hälfte
                      swapf   Save,W         ; D0-D3 aus Save --> D4-D7 
in w
                      call    LCDsndI        ; LCDsndI erledigt die 
Maskierung
                      call    wait2ms        ; 2ms warten
                      return
;-----------------------------------------------------------------------
; Inhalt von w an LCD senden (D - Daten)
LCDsendD:
                      movwf   Save           ; bewahrt das ankommende 
Byte auf
                                             ; obere Hälfte
                      call    LCDsndD        ; LCDsndD erledigt die 
Maskierung
                      call    wait40us       ; 40us warten
                                       ; untere Hälfte
                      swapf   Save,W         ; D0-D3 aus Save --> D4-D7 
in w
                      call    LCDsndD        ; LCDsndD erledigt die 
Maskierung
                      call    wait2ms        ; 2ms warten
                      return
;----------------------------------------------------------------------- 
-
; sendet ein Daten-Nibble zum Display
LCDsndD:
                      andlw    b'11110000'    ; nur die oberen 4 Bits 
nutzen, RW=0
                      iorlw    b'00000010'    ; RS=1 (Daten)
                      goto     $+2            ; LCDsndI überspringen
; 
------------------------------------------------------------------------
; sendet ein Kommando-Nibble zum Display
LCDsndI:
                      andlw    b'11110000'    ; nur die oberen 4 Bits 
nutzen, RW=0, RS=0
; 
------------------------------------------------------------------------
; jetzt werden die Daten gesendet
                      movwf    LCDPort        ; Daten --> LCDPort
                      bsf      LCDPort,Enable ; Enable-Bit setzen
                      nop                     ; 450ns warten
                      bcf      LCDPort,Enable ; Enable-Bit löschen
                      nop                     ; 450ns warten
                      return
;----------------------------------------------------------------------- 
---
; Display löschen
LCDclr:
                      movlw    b'00000001'
                      call     LCDsendC
                      call     wait2ms
                      return
;----------------------------------------------------------------------- 
---
;Initialisierung des LCD-Displays
LCDinit:
                        errorlevel        -302        ; unterdrücke 
Fehlermeldung
; PORTD Bit 1-7 als Ausgang
                      bsf      STATUS,5        ; wechsle zu Bank1
                      movlw    b'00000000'     ; setze Port D, Bit 1-7
                      movwf    TRISB           ; als Ausgang
                      bcf      STATUS,5        ; wieder in Bank 0 
wechseln
                         errorlevel        +302       ; erlaube 
Fehlermeldung
; 15ms warten
                      call     wait15ms
; 8-Bit-Modus einschalten
                      movlw    b'00110000'        ;0011 senden, D1=RS=0, 
D2=RW=0
                      movwf    LCDPort
                      bsf      LCDPort,Enable
                      nop
                      bcf      LCDPort,Enable
; 4,1ms warten
                      call     wait4ms
; 8-Bit-Modus einschalten
                      movlw    b'00110000'        ;0011 senden, D1=RS=0, 
D2=RW=0
                      movwf    LCDPort
                      bsf      LCDPort,Enable
                      nop
                      bcf      LCDPort,Enable
; 100us warten
                      call     wait100us
; 8-Bit-Modus einschalten
                      movlw    b'00110000'        ;0011 senden, D1=RS=0, 
D2=RW=0
                      movwf    LCDPort
                      bsf      LCDPort,Enable
                      nop
                      bcf      LCDPort,Enable
; 100us warten
                      call     wait100us          ;100us warten
; 4-Bit-Modus einschalten
                      movlw    b'00100000'        ;0010 senden, D1=RS=0, 
D2=RW=0
                      movwf    LCDPort
                      bsf      LCDPort,Enable
                      nop
                      bcf      LCDPort,Enable
; 100us warten
                      call     wait100us          ;100us warten
; 2-zeilig, 5x8-Matrix
                      movlw    b'00101000'
                      call     LCDsendC
; Display aus
                      movlw    b'00001000'
                      call     LCDsendC
; Display löschen
                      call     LCDclr
; Cursor nach rechts wandernd, kein Shift
                      movlw    b'00000010'
                      call     LCDsendC
; Display ein
                      movlw    b'00001100'
                      call     LCDsendC
                      return
;------------------------------------------------

;-------------------------------------------------

;Port-Setup
                      errorlevel        -302      ; unterdrücke 
Fehlermeldung
                      bsf      STATUS,5           ; wechsle zu Bank1
                      movlw    b'00000000'        ; setze Port B, Bit 
0-7
                      movwf    TRISB              ; als Ausgang
                      bcf      STATUS,5           ; wieder in Bank 0 
wechseln
                      errorlevel        +302      ; erlaube 
Fehlermeldung


;------------------------------------------------------------------
;Warte-Routine ca. 0,98 s bei 8,000000 MHz
wait1s:
                      movlw    d'208'             ; 93 für 1s
                      movwf    ZAEHL1
                      movlw    d'240'             ; 38 für 1s
                      movwf    ZAEHL2
                      movlw    d'10'              ; 11 für 1s
                      movwf    ZAEHL3             ; größte Wertigkeit
tloop1s:
                      decfsz   ZAEHL1
                      goto     tloop1s
                      decfsz   ZAEHL2
                      goto     tloop1s
                      decfsz   ZAEHL3
                      goto     tloop1s
                      return

;------------------------------------------------------------------
; Sekunde hochzählen
incs:
                       ; s = d'59' ?
                      bcf      STATUS,Z           ; Zero-Flag löschen
                      movf     s,0                ; s -> w
                      sublw    d'59'              ; 10-w -> w
                      btfsc    STATUS,Z           ; Z-Flag testen, skip 
if clear
                      goto     s59
                      goto     sxx
s59:
                      clrf     s

von Alex (Gast)


Lesenswert?

ja nimm C
jetzt weiß du warum
wenn nicht dann bitte schön
Befehlübersicht
Mnemonic, Operands:  Befehl:  Beein-flusste Flags:  Zyk-len 
Beschreibung:
Byte-Oriented File Register Operations
ADDWF  f,d  ADD W and f  C, DC, Z  1  Addiere Register W u. f
ANDWF  f,d  AND W with f  Z  1  Register W mit f UND-verknüpfen
CLR  f  CLeaR F  Z  1  Lösche Register f
CLRW  CLeaR W  Z  1  Lösche das Arbeitsregister
COMF  f,d  COMplement f  Z  1  Bilde das Komplement des Registers f
DECF  f,d  DECrement f  Z  1  Inhalt des Registers f um 1 verringern
DECFSZ  f,d  DECrement f, Skip if Zerro  --  1 (2)  und überspringe den 
nächsten Befehl, wenn f = 0
INCF  f,d  INcrement f  Z  1  Inhalt des Registers f um 1 vergrößern
INCFSZ  f,d  INcrement f, Skip if Zerro  --  1 (2)  und überspringe den 
nächsten Befehl, wenn f = 0
IORWF  f,d  Inclusic OR W with f  Z  1  Inhalt des Reg. W mit dem Inhalt 
des Reg. f ODER-verknüpfen
MOVF  MOVe f  Z  1  Kopier Register W
MOVWF  f  MOVe W to f  --  1  Kopiere W-Register ins f-Register
NOP  No Operation  --  1  Tue nichts
RLF  f,d  Rotate Left f thru carry  C  1  Inhalt des Registers f links 
rotieren
RRF  f,d  Rotate Right f thru carry  C  1  Inhalt des Registers f rechts 
rotieren
SUBWF  f,d  SUBtract W from f  C, DC, Z  1  Vom Inhalt des f-Reg. den 
Inhalt des W-Reg. abziehen
SWAPF  f,d  SWAP nibbles in f  --  1  Tausche high-Nibble mit low-Nibble
XORWF  f,d  Exclusic OR W with f  Z  1  Reg. W mit Reg. F Exclusiv-Oder 
verknüpfen
Bit-Oriented File Register Operations
BCF  f,b  Bit Clear f  --  1  Lösche in Register f das Bit b (0 → b)
BSF  f,b  Bit Set f  --  1  Setze in Register f das Bit b auf 1
BTFSC  f,b  Bit Test File, Ski if Clear  --  1 (2)  Ist Bit b in 
Register f = 0 überspringe den nächsten Befehl
BTFSS  f,b  Bit Test File, Ski if Set  --  1 (2)  Ist Bit b in Register 
f = 1 überspringe den nächsten Befehl
Literal- und Kontrollbefehle
ADDLW  k  ADD Literal and W  C,DC,Z  1  Addiert Wert k in das 
Arbeitregister W
ANDLW  k  AND Literal with W  Z  1  Undverknüpfung von Wert k und 
Arbeitsregister W
CALL  k  Call subroutine  --  2  Ruft Unterprogramm auf
CLRWDT  Clear Watchdog Timer
1  Löscht Watchdog-Timer (WDT)
GOTO  k  GO TO address  --  2  Go to (Gehe zur) Adresse
IORLW  k  Incluse OR Literal in W  Z  1  Inclusive-ODER Wert k mit 
Arbeitsregister W
MOVLW  k  MOVe literal in W  --  1  Verschiebt Wert nach Arbeitsregister 
W
RETFIE  RETurn From IntErrupt  --  2  Return (Rückkehr) vom Interrupt
RETLW  k  RETurn with Literal in W  --  2  Return (Rückkehr) mit Wert in 
Arbeitsregister W
RETURN  RETURN from subroutine  --  2  Return vom Subroutine 
(Unterprogramm)
SLEEP  Go into standby mode
1  Gehe in Bereitschafts-Modus
SUBLW  k  SUBtract W from Literal  C, DC, Z  1  Subtrahiert Wert k vom 
Arbeitsregister W
XORLW  k  Exclusive OR Literal with W  Z  1  Exclusive-ODER Wert k mit 
Arbeitsregister W

Bedeutung der Buchstaben im Operanden
f: File Register
d: Destination (Ziel-) Register
   d = 0  W-Register
   d = 1 f-Register (default)
b: Bit number (0-7)
k: Literal (8-Bit Wert)
TO: Time Out
PD: Power Down
OPD: Operands
CYC: Instruction Cycles
PC: Program Counter
TOS: Top of Stack
Assemblersyntax der unterschiedlichen Zahlenformate
h or 0x: hexadecimal (Wert in Hochkomma)
b: binary (Wert in Hochkomma)
d: decimal (Wert in Hochkomma)
a: asci (Wert in Hochkomma)

von spess53 (Gast)


Lesenswert?

Hi

>ja nimm C jetzt weiß du warum

Und wo ist jetzt das Argument für C?

Viel wichtiger als die Sprache ist die genaue Kenntnis der Hardware (-> 
Datenblatt des Controller). Sonst wird das weder in Assembler noch in C 
was.

MfG Spess

von ucWriter (Gast)


Lesenswert?

Sehe ich genauso wie spess53. IHMO wenn man wissen will, wie ein uC 
funktioniert, baut man z.B. mal ein Addierwerk auf. Oder welche 
Grundlagen sind gemeint?

von Alex (Gast)


Lesenswert?

C ist mit der struktur ist einfache stuktur cooler
http://www.8051projects.net/lcd-interfacing/lcd-4-bit-programming.php

von spess53 (Gast)


Lesenswert?

Hi

>C ist mit der struktur ist einfache stuktur cooler

??????

MfG Spess

von Lukas S. (lukas74)


Lesenswert?

Ok vielen dank soweit, werde wohl erstmal mit assembler anfangen um das 
ganze grundlegend aufzubauen und dann zu c überschwenken. Hätte aber 
noch eine Frage, und zwar was brauche ich denn mindestens um einen 
microcontroller zu betreiben? Also hab schonmal die schaltung von einem 
freund angeschaut und der haate da noch register und treiber, ist das 
zwingend notwendig in eienr schaltung mit mikrocontroller? Weil soweit 
ich weiß er doch auch speicher etc. integriert hat?

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.