PDA

Vollständige Version anzeigen : ProgStudio 2007


JochenW
30.01.2008, 11:45
Hi
Bin neu hier
Hab mir jetzt (für meine projektarbeit) ein ISP Experimentierboard zugelegt von Batronix.
nun gut ich bin es nur gewöhnt einen alten 8085 mit assembler zu programmieren und nun stoße ich leider an meine grenzen.
auf dem board ist ein T89C51AC2 controller und den möchte ich nun mit ProgStudio 2007 programmieren.
mit zähler, zeit usw.
nungut
nun ich suche kleine programme (wie z.b ein einfacher zähler der per taster hoch oder runter zählt und es auf dem LCD anzeigt) damit ich einen start habe.
und ich suche eine syntaxhilfe für das programm.
z.B wenn ich in der C programmierung etwas in eine bedingung setzte wie
if var1 != 0 ; variable1 ungleich 0
{
....
}

diese sachen wie ungleich, gleich oder kleiner , größer wie kann ich die in der software einbauen (in progstudio 2007) ??
HILFE ;)

danke für eure hilfe im voraus

JochenW
30.01.2008, 13:41
hab noch eine frage wie funktioniert das mit der Do While schleife ??
könnte mir da jemand ein zwei kleine beispiele posten ?
wie z.b
als text
wiederhole solange registerA gleich 0 ist.
oder so..
danke :)

André Bauer
30.01.2008, 13:54
Hallo Jochen,

Du findest im Unterordner "Examples" eine Reihe an Beispielprogrammen. Darunter auch ein umfangreiches Beispiel zum ISP Board, dass alle Sensoren und Anzeigen nutzt.

Zu der Hochsprachenergänzung des Assemblers in Prog-Studio 2007:
Im Handbuch findest Du ab Seite 73 die Beschreibungen mit Beispielen dazu.

Folgende Erweiterungen werden derzeit unterstützt:
- Do / Loop
- While / End While
- For / Next
- If Then

Hier das gewünschte Beispiel zum Do/Loop:
index DATA 50h
MOV index, #5
Do
DEC index
Loop While index > #0

MfG
André Bauer

JochenW
30.01.2008, 15:59
Danke bin schon weiter gekommen :)
aber nun hab ich leider noch eine frage
wie kann ich einen dadatabel laden
hab mal versucht hier ein kleines programm zu erstellen das mir die möglichkeit gibt die LED´s durch tastendruck unterschiedlich anzusteuern
wo hab ich den den fehler ??


Main:
SETB P0.0
MOV R2,#11111111b
S1:
MOV R3,#8
Do
If Not BIT P3.5 Then ;Taster P3.5
MOV DPTR,#Tabel
MOVX A,@DPTR
MOV R2,A
DEC R3
End If
MOV P2,R2
Loop While R3 > 0
JMP S1

Tabel:
DB 11111110b,11111101b,11111100b,11110110b
DB 00000000b,00111110b,11000110b,11100010b

André Bauer
30.01.2008, 16:20
Hallo Jochen,

MOVX adressiert ein externes RAM, insofern ein solches angeschlossen ist. Du möchtest aber den Programmspeicher adressieren. Das geht per MOVC.

Beispiel:

$INCLUDE 80C51.mc

MOV DPTR, DataTable

For R1 = #0 To #6
MOV A, R1
MOVC A,@A+DPTR
MOV P2, A
Next

Ende:
JMP Ende

DataTable:
DB 11h, 22h, 33h, 44h, 55h, 66h, 77h

Grüße
André

JochenW
07.02.2008, 14:24
Hi
Ich versuch gerade den Inhalt (Dezimalzahl) eines Registers auf dem LCD auszugeben.
Wie kann ich das am besten machen?

$INCLUDE ".\Atmel\T89C51AC2.mc"

ORG 0h
JMP Initialize

ORG 7800H ; here begins the usabe memory of the community version

$INCLUDE Declarations.asm
$INCLUDE LCD.asm
$INCLUDE Functions.asm
$INCLUDE Wait.asm


Initialize:
MOV P0, #0h ; Initialize Batronix ISP board
MOV SP, #40H
CLR P4.0


; -------------------------------------------------------------
; Main program
; -------------------------------------------------------------
;Hier wird Taster P3.4 und P3.7 zum Zählen genutzt
;Register R7 und R6 sind für die Wait Funktion
;P3.4 ist zum hochzählen und P3.7 zum runterzählen

Main:
SETB P0.0
MOV P2,#11111111b
MOV R5,#00d

Main1:
If Not BIT P3.4 Then
LCALL wait_50000
INC R5
JMP Vergleich
Else
If Not BIT P3.7 Then
LCALL wait_50000
DEC R5
JMP Vergleich
End If
End If

Vergleich:
If R5 < #01d Then
JMP Main
Else
If R5 > #98d Then JMP Main Else JMP Ausgabe
End If

Ausgabe:
LCALL LCD_Init
MOV DPTR, #R5
LCD_SetCursorLine0 #0
LCALL LCD_Print_DPTR
JMP Main1


So ab Ausgabe hab ich ein Problem :) die schleifen funktionieren hab sie schon im Debugg modus getestet.

André Bauer
08.02.2008, 07:45
Hallo!

Der DPTR (Datenpointer) kann eine Speicherstelle im Programmspeicher oder im externen RAM adressieren und die Daten dann per MOVX bzw. MOVC in den Akku holen... Das Auslesen eines Registers (bei Dir R5) klappt so aber nicht. Die Register sind aber im internen RAM und die LCD_Print_DPTR Routine ist auch für das Drucken eines festens Strings aus dem Programmspeicher konzipiert (siehe LCD_Print_DPTR Routine in der Datei lcd.asm).

Wir haben für Deinen Einsatzbereich aber auch bereits eine fertige Routine (ebenfalls in der Datei lcd.asm). Versuche es mal mit der LCD_Print_AccuNumber. Diese zerlegt den Inhalt des Akkumulators in einzelne Ziffern und zeigt diese Ziffern auf dem LCD an. Die Parameter R2 und R3 sind in der Routine erklärt.

Ausgabe:
LCD_SetCursorLine0 #0
MOV A, R5
MOV R2, #1 ;Display mode 1: display leading spaces
MOV R3, #3 ;Number of digits = 3
LCALL LCD_Print_AccuNumber
JMP Main1Das LCALL LCD_Init solltest Du nur einmal ausführen. Die Initialisierung eines LCD benötigt einige Zeit und sollte nicht in einer Ausgabeschleife immer wieder durchgeführt werden. Setze die Anweisung als letzte Anweisung in deinen Bereich "Initialize".

Grüße
André

JochenW
08.02.2008, 16:30
Hi hab noch mal eine frage :)

also ich will das register R4 immer nur um einen wert hochzählen oder um einen runterzählen.

Main:
SETB P0.0
MOV P2,#11111111b
MOV R4,#00d
MOV R1,#01

Main1:
If Not BIT P3.4 Then
LCALL wait_50000
INC R4
JMP Vergleich
Else
If Not BIT P3.7 Then
LCALL wait_50000
DEC R4
JMP Vergleich
End If
End If

Vergleich:.............


nun wenn ich es so schreibe zählt das board zuviele takte (impulse). dann hab ich mir gedacht eine zusätzliche schleife einzubauen.

If R1 > #00 then
Inc R4
mov R1,#00
jmp vergleicher
end if
if bit P3.4 then mov R1,#01


aber die funktion spinnt ein wenig :)
nun weiß ich nicht weiter.
hast du eine idee ??

gruß
jochen