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:)
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. ....."
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.
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?
;;**********************************************************************
; 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
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)
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
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?
C ist mit der struktur ist einfache stuktur cooler http://www.8051projects.net/lcd-interfacing/lcd-4-bit-programming.php
Hi
>C ist mit der struktur ist einfache stuktur cooler
??????
MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.