max232tje doet zn werk niet goed

Ik heb hier een nax232 ictje op mn breadboard geheel volgens de datasheet aangesloten. Ik dacht voordat ik hem met mn pic test even aan mn multimeter hangen. Als ik hem aanzet komt er een com uitgang -13 volt(pin 14) te staan. Als ik dan 5 volt op de bijbehorende ingang(pin 11) zet gebeurt er niks met de uitgangsspanning. Het ictje is een imatie van de max hij is van sipex, kan dit uitmaken. Ik meet de spanning met mn scoop omdat mn meetpennen van mn multimeter kapot zijn. Kan dit ook uitmaken?

[Bericht gewijzigd door pientertje op dinsdag 28 oktober 2008 16:42:11 (12%)

Shiptronic

Overleden

Ljkt me goed te werken, hang die ingang eens aan de 0V en kijk of de uitgang +12V word, dan liujkt mij de werking OK

code:



   digi    Ud   Urs232
  ---------------------
    0       5V   -12V
    1       0V   +12V 

Wie de vraag stelt, zal met het antwoord moeten leren leven.

aha ingang aan 0 volt. Tja ik maar aan een de + 5v hangen en er gebeurt niets. Werkt nu inderdaad

[Bericht gewijzigd door pientertje op dinsdag 28 oktober 2008 16:45:34 (11%)

Aansluit schema?

Volgens mij is bij rs232 een logische 1 -10V oid.

Kan ik dit dan als code gebruiken:

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Poortnamen
SYMBOL Potmeter     = PORTA.1 ;Potmeter aangesloten via een condensator aan GND
SYMBOL LED_Groen    = PORTA.2 ;Groene LED 
SYMBOL LED_Rood     = PORTA.3 ;Rode LED (brandt straks tegengesteld aan de groene LED)
;Variabele declareren
DIM weerstand AS BYTE         ;Deze variabele bevat straks de stand van de potmeter  
DIM weerstandoud AS BYTE
weerstand = 100
DELAYMS 500
CLEAR
CLS                         ;Wis alle RAM geheugen
PRINT "(C) W. Melching"

;Hoofdprogramma
WHILE 1 = 1  
  weerstandoud = weerstand                 ;Oneindig door blijven knipperen
  weerstand = POT Potmeter, 125;Stand van potmeter (0...255) aan variabele 'Weerstand' geven 
  IF weerstandoud <> weerstand THEN
  SEROUT PORTA.0 , 16780 , [ DEC weerstand ]
  PWM PORTA.6, weerstand, 1
  END IF
  PRINT AT 2,1, DEC weerstand
  
WEND                          ;Terug naar WHILE

END                           ;Einde programma

Of moet ik het signaal inverteren door de max232?
En zo moet ik hem toch aan mn compoort hangen:
http://i12.tinypic.com/52littz.jpg

Het is beter om een xtal te pakken. Bij het doorsturen van de data is geen kloklijn, de uc moet dus zijn eigen klok maken en die moet kloppen met de ontvanger (is instelbaar). Een kristal is stabieler dan de interne RC en daarom beter.

Ik zou het programma iets simpeler houden, nu gebruik je zoveel dingen te gelijkertijd waardoor je meer kans op fouten hebt.

Ik zou zoiets doen

For x = 0 to 100 step +1
toggle led
serout x
delayms 500

en dan gewoon kijken wat je binnenkrijgt.

Ik heb nu dit:

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20                       ;Kristal van 20MHz
DIM x AS BYTE

FOR x = 0 TO 100
TOGGLE PORTA.1
SEROUT PORTA.0 , 16780 , [ DEC x ]
DELAYMS 500
NEXT x
END

maar er gebeurt niks op mn computer
ik zie wel op mn scoop elke halve seconde een flikering naar -10 v gaan. Ik heb hyperterminal op 2400 baud gezet
Het ledje knippert prima

In je programma zet je de baud op 16780 en op je pc op 2400. Logisch dat het dan niet werkt.

Hij werkt al moest signaal inverteren

16780 is al geïnverteerd, heb je nu dus 396 gebruikt of op je computer veranderd?

@bassie- lees de help van Picbasic eens...

Druk- en typfouten voorbehouden.

ik heb 396 gebruikt.
Ik las in de help van picbasic dat je niet dingen uit kan voeren terwijl je serieel data ontvangt. Maar ik wil dat er ledjes met pwm gedimt worden waarvan de dutycycle serieel ontvangen wordt.

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20                       ;Kristal van 20MHz
DIM weerstand AS BYTE         ;Deze variabele bevat straks de stand van de potmeter  
DIM weerstandoud AS BYTE
CLEAR
weerstand = 100
WHILE 1 = 1  
weerstandoud = weerstand
SERIN PORTA.0 , ??? , [ weerstand ]
IF weerstandoud <> weerstand THEN
  PWM PORTA.6, weerstand, 1
END IF
WEND
END

Wat moet ik voor baudrate invullen hetzelfde als bij serin?
Want ik volg dit niet helemaal:

Determine the bit period. (bits 0 - 11) (1,000,000 / baud rate) - 20
Data bits and parity. (bit 13) 8-bit/no-parity = step 1 + 0. 7-bit/even-parity = step 1 + 8192
Select polarity. (bit 14) True (noninverted) = step 2 + 0. Inverted = step 2 + 16384

uit de help

Ja. Voor je rs232 de USART van de 16f628a gebruiken. Als die data ontvanger een interrupt laten maken. Wat je nu doet is de USART in software na maken. Dat moet je alleen doen als je uC geen module daarvoor aan boord heeft. De 628a heeft dat wel dus die moet je gewoon gebruiken.

Pic basic heeft voor de usart een commando, maar dan moet je wel zelf de registers goed instellen. Maar dat is niet meer dan even in de datasheet kijken.

Stel je schrijft zoiets pwm porta.1 250 10. Dan maakt de pic een pwm van 10 pulsen met een freq van 250Hz op porta.1. Zodra hij dat gedaan heeft stopt hij met pwmmen. Jij wilt een pwm die door blijft gaan. Daarvoor zijn 2 oplossingen

Een hardware pwm met de ingebouwde ccp module. De instructie HPWM in picbasic (zit op een vaste pin zie datasheet).

Een software pwm met timer interrupts. Je laat een timer x keer per sec een interrupt genereren. Bij elke interrupt verhoog je de waarde van x met 1 en kijkt dan of leds hoog of laag moeten.

bij interrupt
inc x
if (x >= waardeled1) then high led1
else low led1
zelfde voor de eventuele andere leds

waardeled1 is dan de via rs232 ontvangen waarde.

Hoe werken interrupts? Ik heb daar nooit mee gewerkt. Is dat zoiets als het break; commando in c? Zodat je uit een while 1=1 loop kan breken. En dan de nieuwe waarde inlezen en dan weer verdergaan?

Nee. Interrupt = onderbreking. De pic word dus onderbroken door iets bijvoorbeeld de USART.

Stel jij stuurt 8 data pakketjes door. Dan wil je dat dat gelijk verwerkt word, gebeurt dat niet dan mis je pakketjes. Dus als jij een programma hebt zoals.

Doe een adc meting
Doe een pwm
Doe wat leuks
Ontvang data.

Dan gaat hij gewoon het lijstje af. De data word pas verwerkt als hij bij ontvang data is in het lijstje. Maar jij wilt dat de pic gelijk de data verwerkt en het andere even aan de kant legt. Daarvoor zijn interrupts.

Als er data binnenkomt dan veroorzaakt de USART een interrupt (als je dat instelt). Als er een interrupt komt dan slaat de pic op waar hij was en springt dan gelijk naar zijn interrupt afhandeling (die je zelf moet maken). Als de interrupt afhandeling voorbij is gaat hij weer terug naar waar hij was.

Hoe interrupts werken moet je even doorhebben. Op het internet is er veel over te vinden en in de datasheet staat ook veel.

Ik heb nu dit bijelkaar gescharreld.

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20 
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit4:Continu ontvangen
HSERIAL_TXSTA = %00000000     ;Bit5:Transmitpin uitgeschakeld (TXEN (Transmit ENable) = 0)
                    
DIM weerstand AS BYTE         ;Deze variabele bevat straks de stand van de potmeter  
DIM weerstandoud AS BYTE
CLEAR
weerstand = 100

TRISB = %11111111
ON_INTERRUPT GOTO InterruptAfhandeling ;Spring naar label als data is ontvangen door de USART
INTCON.7 = 1                  ;GIE  (Global Interrupt Enable) activeren
INTCON.6 = 1                  ;PEIE (PEripheral Interrupt Enable) activeren
PIE1.5   = 1                  ;RCIE (USART ReCeive Interrupt Enable) activeren
HPWM 1, 0, 2000
WHILE 1 = 1  
IF weerstandoud <> weerstand THEN
  HPWM 1, weerstand, 2000     ;pwm op port b7
END IF

WEND
InterruptAfhandeling:
weerstandoud = weerstand
HSERIN 7, Verder, [weerstand] onvangen op b1

Verder:
CONTEXT RESTORE
END

Nee. De opbouw van je code moet zijn.

code:


device,config etc. 
on_interrupt goto int
symbol bla
dim bla as bla

Goto main ;spring over de interrupt heen.

int:
doe je interrupt afhandeling
CONTEXT RESTORE

main:
stel poorten in etc.
goto main.

Jij hebt on_interrupt ergens halver wegen staan. En context restore staat niet in je interrupt afhandeling.

InterruptAfhandeling:
weerstandoud = weerstand
HSERIN 7, Verder, [weerstand] onvangen op b1

Verder:
CONTEXT RESTORE
END

De syntax vor hserin is: hserin timerout, timerout label, parity error labal [variabele].

Jij hebt ingesteld dat als er een timeout van 7ms optreeds de pic verder gaat bij verder. In verder heb je alleen context restore staan. De context restore hoort bij de interrupt afhandeling. In je timeout verwerk je de timeout. Door op een lcd "time out error" oid te zetten.

Even een stukje uit de datasheet:

6. Enable the reception by setting bit CREN.
7. Flag bit RCIF will be set when reception is
complete and an interrupt will be generated if
enable bit RCIE was set.
8. Read the RCSTA register to get the ninth bit (if
enabled) and determine if any error occurred
during reception.
9. Read the 8-bit received data by reading the
RCREG register.
10. If an OERR error occurred, clear the error by
clearing enable bit CREN.
Flag bit RCIF is a read-only bit, which is
cleared by the hardware. It is cleared when the RCREG
register has been read and is empty.

Zonder het stukje over de registers instellen. Stap 8 telt niet voor jou.

Als de data is ontvangen krijg je een interrupt (stap7). Dan moet je de data uitlezen uit het RCREG register (stap9). En als het nodig is CREN resetten.

Verder staat er dat de flagbit gereset wordt zodra je het RCREG register uitleest. De flagbit is nodig voor de volgende interrupt.

Het enige wat je dus hoeft te doen in je interrupt afhandeling is.

code:


interrupt:
variabele = RCREG
CONTEXT RESTORE

Dank ik heb nu dit:
Maar hoe zorg ik ervoor dat hij een inverted signaal verwacht?

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20
ON_INTERRUPT GOTO InterruptAfhandeling ;Spring naar label  
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit4:Continu ontvangen
HSERIAL_TXSTA = %00000000     ;Bit5:Transmitpin uitgeschakeld (TXEN (Transmit ENable) = 0)
                    
DIM weerstand AS BYTE         ;Deze variabele bevat straks de stand van de potmeter  
DIM weerstandoud AS BYTE
CLEAR
weerstand = 100

TRISB = %11111111
als data is ontvangen door de USART
INTCON.7 = 1                  ;GIE  (Global Interrupt Enable) activeren
INTCON.6 = 1                  ;PEIE (PEripheral Interrupt Enable) activeren
PIE1.5   = 1                  ;RCIE (USART ReCeive Interrupt Enable) activeren

GOTO main

InterruptAfhandeling:
weerstand = RCREG ;onvangen op b1
CONTEXT RESTORE

main:
HPWM 1, 0, 2000
WHILE 1 = 1  
weerstandoud = weerstand
IF weerstandoud <> weerstand THEN
  HPWM 1, weerstand, 2000     ;pwm op port b7
END IF

WEND

END

Heb je ook al getest of het werkt?

En ik zou on_interrupt goto toch gelijk onder xtal 20 zetten. Dat maakt het overzichtelijker (zeker in een groot programma).

IK heb het nog niet getest dat ga ik zo doen, ik wou niet mn max232 opblazen. Ben daar bij elektroboer voor 4,50 mee opgelicht. Maar hoe kan ik een inverted signaal versturen met hyperterminal? Of waar kan ik instellen dat er een inverted signaal binnenkomt door de max232.

[Bericht gewijzigd door pientertje op vrijdag 31 oktober 2008 11:30:47 (18%)

Zowel de UART in je PC als de MAX232 inverteren automatisch. Daar hoef je dus niets voor te doen.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Maar toen ik data ging verzenden naaar de pc moest ik het wel inverteren of is dit een ander verhaal?

Omdat je het toen software matig deed en nu hardware matig.

Het werkt helaas niet. Ook niet als ik de hpwm eruit haal en alleen de data probeer terug te sturen. HELP!

Ik dit probleem intussen opgelost, maar nu heb ik een breadout bordje er van gemaakt. Hij doet het niet goed. De uitgang van pin 14(en 7)is gewoon de voedingspanning wat ik ook met de ingang doe. Is hij kapot?
http://www.uploadarchief.net/files/download/bordje.png

mod edit: 3091 x 2786, kan het nog groter te groot?

[Bericht gewijzigd door klein is fijn op dinsdag 27 januari 2009 22:05:23 (10%)