PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pin auf High setzen Staver40/Atmega32 -> Bin Neuling



plumpi
06.05.2006, 00:14
Hallo zusammen,

habe das Entwicklerboard für den Staver40 von AVR und den Staver40 MC.

Bisher habe ich ausschließlich mit BasicStamps von Parallax gearbeitet.

Arbeite jetzt mit Bascom und dem built in programmer über RS232 um den MC zu programmieren. Ein paar Test-Programme laufen auch.

Jetzt zu meinem Problem:
Ich möchte ein Programm schreiben, das am Seriellen Port auf einen Integer-Wert wartet und dann einen bestimmten Pin auf "High" schaltet, damit ich meine Relais damit schalten kann.

Mit dem BasicStamp geht das ziemlich einfach:

' {$STAMP BS2p}
' {$PBASIC 2.5}


rpin CON 16
bmode CON 240
maxtime CON 10000
signal VAR Byte
i VAR Byte

Main:

SERIN rpin,bmode,maxtime,timeout,[signal]
' Timeoutschleife für seriellen
timeout:
PAUSE 20
GOTO main


IF signal = 1 THEN irst

irst:
High 1 'Pin 1 einschalten
High 2 ' Pin 2 einschalten


Beim Staver40 habe ich keine Ahnung wie das gehen soll?

Habe es mit folgendem Programm probiert ob ich überhaupt über Seriell daten verarbeiten kann.


$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600

Dim S As Integer
Dim Mybaud As Long
Do
'Daten empfangen
Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1
'Daten senden
Serout S , 0 , D , 1 , Mybaud , 0 , 8 , 1
Wait 1
Loop

End

Kann mir irgend jemand bitte helfen, wie das Programm aussehen soll.
Wie kann ich z. B. Pin PA1 auf High bzw low schalten.

Vielen Dank im Voraus!

molleonair
06.05.2006, 01:28
also ich weiß nicht ob ich verstehe was du meinst aber mit der Anweisung
set porta.1
reset porta.1
schaltest du pin a1 auf high und low

plumpi
06.05.2006, 10:40
Guten Morgen,

wie ich die Pins schalte, ist mir jetzt bekannt. Danke.

Das Problem ist, das ich über die RS232 Schnittstelle Daten senden möchte.

Ich habe versucht das mit folgendem Code zu lösen:



$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600



Dim S As Integer
Dim Mybaud As Long

Mybaud = 9600

Config Porta = Output


Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1

If S = 1 Then

Wait 2
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2

End If

Funktioniert aber nicht. Wenn ich über RS232 Integer 1 sende wird nichts ausgeführt?

plumpi
06.05.2006, 10:54
Guten Morgen,

wie ich die Pins schalte, ist mir jetzt bekannt. Danke.

Das Problem ist, das ich über die RS232 Schnittstelle Daten senden möchte.

Ich habe versucht das mit folgendem Code zu lösen:



$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600



Dim S As Integer
Dim Mybaud As Long

Mybaud = 9600

Config Porta = Output


Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1

If S = 1 Then

Wait 2
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2

End If

Funktioniert aber nicht. Wenn ich über RS232 Integer 1 sende wird nichts ausgeführt?

linux_80
06.05.2006, 10:56
Hallo,

als erstes musst Du eine Schleife um das Programm legen, damit es nach dem ersten durchlauf nicht schon beendet ist,

Do
... hier ist der Programmteil der immer ausgeführt wird
Loop

dann kannst Du ein Zeichen einlesen mit Input, dazu in der Bascomhilfe schauen,
wenn man vorher eine variable als Int dimensioniert, wir die auch gleich noch umgewandelt.

plumpi
06.05.2006, 11:16
Vielen Dank erstaml.

Leider komme ich nicht weiter.

Eigentlich weis ich nicht mal, wo ich den Inputbefehl reinschreiben soll.

Habe es so probiert:

$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600



Dim S As Integer
Dim Mybaud As Long

Mybaud = 9600

Config Porta = Output

Do

Input S
Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1

If S = 1 Then

Wait 2
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2

End If

Loop


Tut sich wieder nichts. Stimmt den überhaupt meine Pinbelegung bei SERIN? Welcher Pin ist denn der SIN bzw. RxD? Habe Port D und Pin 0 eingetragen, glaube aber nicht dass das stimmt!

Kannst du mir vielleicht ein paar Zeilen dazu Schreiben? Bin echt am verzweifeln obwohl die Lösung sicherlich einfach ist, wenn man sie kennt.

Danke im Voraus

linux_80
06.05.2006, 11:51
Du kannst das Serin ganz weglassen, denn das Input macht das alles alleine.

sonst schauts gar ned so schlecht aus,
Input wartet, bis über die UART was rein kommt,
danach wird der Wert per If abgefragt,
und beim Loop gehts wieder von vorne an.
Sollte doch was tun !

Allerdings nur, wenn der M32 wirklich mit den angegebenen MHz läuft !
Evtl. mal probieren im Programm statt den 14MHz einmal 1MHz oder 8MHz angeben, wenn sonst nix geht !
Dann musst Du dir die Beschreibung der Fusebits anschauen, wenns danach geht.

Wenn Du den ganzen Port auf einmal setzen oder löschen willst, kann mans auch so schreiben:
Porta = &B11111111
dann wird das Programm etwas kürzer.

plumpi
06.05.2006, 12:09
Hi,

die Mhz stimmen.

Die technischen Daten sind:

ATmega32 8Bit RISC Mikrocontroller mit 14,745MHz Quarztakt
32KB Flash
1KB EEPROM
2KB RAM
USART, SPI, IIC
2x 8Bit, 1x 16Bit Timer
2x ext. Interrupt
bis zu 28 digitale I/Os
8x 10Bit A/D-Wandler
2x 8Bit D/A-Wandler
32KB serielles EEPROM (I2C)
DS1307 Real Time Clock (I2C)
ISP-Schnittstelle
RS232 Schnittstelle bis 115kBd mit ESD-geschütztem Treiber
Bootloader für einfachen Download via RS232
erweit. Temp.bereich: -40..+85°C


Habe das Programm jetzt abgeänder:


$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600

Dim S As Integer ' Sende Integerwert
Dim Mybaud As Long


Config Porta = Output

Do

Input S ' Warte auf Input von RS232


If S = 1 Then 'Wenn Input Integer 1 dann

Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2

End If

Loop

Tut sich leider nichts. Im RS232 Buffer sehe ich das ich "1" Integer gesendet habe, aber der RS232 Buffer wird nicht ausgelesen. Beim Staver40 ist der RxD auf Pin 1. Muss ich den sepparat initilisieren?

Wie es aussieht, liest das CarrierBoard nichts an der RS232 aus.

linux_80
06.05.2006, 12:34
Hast Du 'nen Link zu dem Board, damit man sich das mal angucken kann, muss man die Sachen selber verdrahten, oder ist das am Board schon gemacht ?

Das Programm passt ansonsten so, es kann nur an der Verkabelung liegen, oder an den MHz !

Wie weisst Du das es sicher die 14MHz sind, selber die Fusebits gesetzt/überprüft ?

plumpi
06.05.2006, 12:38
Hi,

die Fusebits habe ich nicht selber gesetzt.

http://elmicro.com/de/staver40.html

Hier ist der Link zum Staver40 und dem zugehörigen Carrier Board.

Dnake nochmal.

linux_80
06.05.2006, 12:54
Wie programmierst Du den M32 über den Bootloader oder per ISP ?

Wenn per ISP dann lies mal die Fusebits aus, und zeig sie her, dann schau ma mal ob der die 14MHz verwendet.

Ansonsten müssen wir warten bis wer anders 'ne Idee hat wie das mit diesem Board geht.

plumpi
06.05.2006, 13:02
Habe keinen ISP. Programmiere über den Bootloader. Und zwar über den Lawicel BootLoader.

plumpi
06.05.2006, 13:17
Das folgende Programm funktioniert einwandfrei:

$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600

Dim S As Integer ' Sende Integerwert
Dim Mybaud As Long


Config Porta = Output
'Config Portd.0 = Input

Do

Print "hello"
'Wenn Input Integer 1 dann

Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2



Loop

Sobald ich "Input S" setze und ohne "if-Schleife" irgendeinen Integer Wert abfrage, geht nichts. Habe auch die Mhz verändert und bekomme dann Falsche Werte. Also daran glaube ich kann es nicht liegen.

plumpi
06.05.2006, 13:28
Hi,

jetzt funktioniert es!!


$regfile = "M32DEF.DAT" ' Mega32
$crystal = 14745600 ' StAVeR-40 XTAL
$baud = 9600

Dim S As Integer ' Sende Integerwert
Dim Mybaud As Long


Config Porta = Output
'Config Portd.0 = Input

Do

Input S

' Warte auf Input von RS232
If S = 1 Then
Print "hello"
'Wenn Input Integer 1 dann

Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Porta.7 = 0
Wait 2
End If


Loop

Ich muss zusätzlich immer die Return Taste drücken.

Warum ist das so??. Gibts keine Möglichkeit ohne RETURN Taste zu arbeiten?

linux_80
06.05.2006, 14:05
ja,
schau Dir mal diese Befehle in der Hilfe an:
Ischarwaiting, Waitkey, Inkey
Da ist auch immer ein Beispiel dabei.

plumpi
06.05.2006, 16:01
Vielen Dank für die Hilfe!

Mit Inkey() läuft das Prima.