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.