Archiv verlassen und diese Seite im Standarddesign anzeigen : Pin auf High setzen Staver40/Atmega32 -> Bin Neuling
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
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?
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.
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.
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 ?
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.
Habe keinen ISP. Programmiere über den Bootloader. Und zwar über den Lawicel BootLoader.
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.
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.
Vielen Dank für die Hilfe!
Mit Inkey() läuft das Prima.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.