Interrupts met een PIC

Wie bang is om te vragen schaamt zich om te leren.
Plaats reactie
mcu_boytje
Berichten: 11
Lid geworden op: ma 6 apr 2009, 15:33
Locatie: GENT

Interrupts met een PIC

Bericht door mcu_boytje »

Hallo iedereen

Ik heb het volgende project dat we met 4 elektronica studenten gaan uitwerken een bodediagram plotter met microcontroller.

Ik neem mijn verantwoordelijkheid tot de firmware.
Ik werk met de PIC18F2550, met een kristal van 20MHz.
De print is bijna afgewerkt enkel nog zien als ik die MUX kan gebruiken.

Ik probeer via EasyPIC5 board mijn PIC en neen hij werkt dus niet en nochtans een nieuwe, moet aan de config bits liggen

Vraag 1
=====
- Hoe stel ik die config bits in opdat hij zal werken met dat kristal? Heeft iemand als met die PIC18F2550/4550/2450/4450 gewerkt?

Vraag 2
=====
Ik heb het volgende algoritme dat mijn bodediagram plotter moet uitvoeren:

STAP 1
=====
Ik ga via het SPI protocol digitaal de frequentie instellen dus wat ik eerst doe is het control register eenmalig initialiseren en dan 4 bytes versturen van de PIC naar de DDS

STAP 2
=====
Vervolgens ga ik twee analoge waarden inlezen Vin en Vout via de interne ADC van de microcontroller en opslaan in twee variabelen Din en Dout. Ik maak gebruik van 10 bits ADC en de reference spanning van 5V van de PIC en maak gebruik van de ingebouwde functie ADC_Read(channel)

STAP 3
=====
De opgeslagen waarden Din en Dout zal ik via serial communicatie met de ingebouwde functies USART_Write() sturen naar de PC met een vertraging denk ik. De raw data wordt gans bewerkt door mijn labpartner.

STAP 4
=====
Ook moet het mogelijk zijn om data die de gebruiker van de PC naar de PIC verstuurd via de serial port dan weer met ingebouwde commandos USART_Data_Ready() en USART_Read()

Kan ik hier gebruik maken van interrupts?. Wanneer kan je zeggen nu is een interrupt noodzakelijk want daar kom ik niet uit

Ik weet grofweg niet wanneer ik hier interrupts kan gebruiken?
Ik werkt met mikroC en heeft een gereserveerd woord interrupt()

Hoe ik de code kan schrijven doe ik zo:

void main()
{
init_mcu();
init_dds();
while(1);
of moet ik dat zo doen:
while(1)
{
functies aanroepen?
}
}

interrupt()
{
Welke stappen moet ik hier zeker volgen bij het werken van interrupts?
}


Ik ben overtuigd dat iemand mij hier op weg kan helpen

Met vriendelijke groet
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Hoeveel topics ga je hier nu nog over openen? Graag alles in 1 topic houden !!
Ik zal de rest op slot doen dan gaan we hier verder

Vraag 1 : zie datasheet
Vraag 2 : Dat ligt er juist aan wat het precies moet doen.
mcu_boytje
Berichten: 11
Lid geworden op: ma 6 apr 2009, 15:33
Locatie: GENT

Bericht door mcu_boytje »

Stijn,

Bij vraag 1 voor het instellen van die config bits staat dat nergens in heb die datasheet al 4 keer gelezen en vind nergens de default instelling

Bij vraag 2 is dat het juiste algoritme die moet opgevolgd worden.
Waar zou ik nu interrupts gaan inzetten, zeker niet bij SPI want dat is niet nodig, en bij de USART voor RX en TX en inlezen in de ADC?

Die mails dat ik je hebt verstuurt gaat over die flowcharts van die DDS chip maar lees dat eerst rustig door en gaat bijzonder leuk vinden dat je die flowcharts in code kan omzetten mag basic zijn want dat is me nog niet gelukt

Mij nog steeds blindstaren op die twee algoritmes die in de datasheet staan en vraag mij af heb ik ze wel nodig?
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

p23 van de datasheet staan de fuses van de oscilator toch :s.

En ik ga die code echt niet voor je maken. Dit is een school opdracht van je. Het gaat erom dat je zelf wat bijleert. Als je je code af hebt en ze werkt niet kan ik wel eens kijken voor je waarom. Maar aangezien je in C werkt geef ik het weinig kans dat ik de fout dan ga vinden.
mcu_boytje
Berichten: 11
Lid geworden op: ma 6 apr 2009, 15:33
Locatie: GENT

Heb hier code gevonden in PIC basic voor sturing van DDS

Bericht door mcu_boytje »

Hallo stijn en mat,

Zou ik die code kunnen gebruiken dus met andere woorden is die volledig voor de besturing van de AD9833 heb dat van een site van Mikroelektronika gehaald

Code: Selecteer alles

Device = 16F877
       
XTAL = 20

Symbol DPin PORTC.4        'Data port DDS 1
Symbol CPin = PORTC.3      'Clock port DDS 1
Symbol DDS_CE1 = PORTC.2     'Chip Enble DDS 1
Symbol DDS_CE2 = PORTC.1     'Chip Enble DDS 2

Output DDS_CE1     'Sets Pin to an Output
Output DDS_CE2     'Sets Pin to an Output
  
   
Dim Frequency As DWord   'Desired Frequency
Dim DDS_OP As Float      'DDS Output
Dim FTW As DWord         'Frequency Tunning word
Dim FTWLSB As FTW.WORD0  'First word LSB of the Frequency tuning word
Dim FTWMSB As FTW.WORD1  'Second word MSB of the Frequency tuning word
Dim FTWLSB1 As Word      '
Dim DDS_Chip As Byte     'Selects DDS chip DDS1 = 1, DDS2 = 2
Dim DDS_Waveform As Byte 'Select Waveforms Type Sine = 1, Triangle = 2, Square = 3 (TTL)
Dim DDS_Control_Register As Word
Dim Freq_Reg As Bit      'Selects Frequency Register REG0 or REG1

Dim var1 As Byte
Dim key As Byte

'KEYPAD_PORT PORTB
Include "proton_4.inc"
Cls

'Initialise DDS1
DDS_CE1 = 0  'Activate DDS (Set Chip Enable Low)
SHOut DPin, CPin, 5, [$2100\16]  'Apply Reset
SHOut DPin, CPin, 5, [$2000\16]  'Remove reset
DDS_CE1 = 1   'Disable DDS (Set Chip Enable High)

'Initialise DDS2
DDS_CE2 = 0  'Activate DDS (Set Chip Enable Low)
SHOut DPin, CPin, 5, [$2100\16]  'Apply Reset
SHOut DPin, CPin, 5, [$2000\16]  'Remove reset
DDS_CE2 = 1   'Disable DDS (Set Chip Enable High)

DDS_Control_Register =  $2100
DDS_Chip = 1
  
Loop:
key = ""
var1 = InKey
key = LookUp var1,["1","2","3","A","4","5","6","B","7","8","9","C","*","0","#","D"]
     Print At; 1, 1, key,

Select key

Case "1"
    Print At; 1, 6, "Button 1"
    Frequency = 1000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 0     'Point to which register
    DDS_Chip = 2     'DDS Chip 1
    
    GoSub FTW_CALC:
    
Case "2"
    Print At; 1, 6, "Button 2"
    Frequency = 2000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 0     'Point to which register
    DDS_Chip = 2     'DDS Chip 1
    
    GoSub FTW_CALC
    
Case "3"
    Print At; 1, 6, "Button 3"
    Frequency = 1000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 1
    
    GoSub FTW_CALC
    
Case "4"
    Print At; 1, 6, "Button 4"
    Frequency = 2000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 1
    
    GoSub FTW_CALC
    
Case "5"
    Print At; 1, 6, "Button 5"
    Frequency = 1000 'Sets Desired Output Frequency
    DDS_Waveform = 3  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 2
    
    GoSub FTW_CALC
    
Case "6"
    Print At; 1, 6, "Button 6"
    Frequency = 1000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 2
    
    GoSub FTW_CALC
    
Case "7"
    Print At; 1, 6, "Button 7"
    Frequency = 2000 'Sets Desired Output Frequency
    DDS_Waveform = 1  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 2
    
    GoSub FTW_CALC
    
Case "8"
    Print At; 1, 6, "Button 8"
    Frequency = 2500 'Sets Desired Output Frequency
    DDS_Waveform = 2  'Sets waveform type
    Freq_Reg = 1     'Point to which register
    DDS_Chip = 2     'DDS Chip 2
    
    GoSub FTW_CALC
    
Case "9"
    Print At; 1, 6, "Button 9"
Case "0"
    Print At; 1, 6, "Button 0"
Case "A"
    Print At; 1, 6, "Button A"
Case "B"
    Print At; 1, 6, "Button B"
Case "C"
    Print At; 1, 6, "Button C"
Case "D"
    Print At; 1, 6, "Button D"
Case "*"
    Print At; 1, 6, "Button *"
Case "#"
    Print At; 1, 6, "Button #"


    
Case Else
Cls
Print At; 2, 1, "No Button Press"
   RSOut "hello"
    
EndSelect

  GoTo loop



FTW_CALC:  'Calculates Frequency tuning words


DDS_OP = Frequency / 0.03725290298      'Equation to produce DDS tuning word  Master CLK / 2pwr28

'Extract LSB Tuning Word
FTW = DDS_OP            'DDS_OP (Float) = Freq tuning word (Dword) << bit shift doesn't work with float
FTWLSB1 = FTWLSB        'Extract LSB and put it in LSB1
  
'Extract MSB tuning word
FTW = FTW << 2          'Shift Bits Left twice
   

ProgrammeDDS:
       
Select Freq_Reg

Case 0
    FTWLSB1 0.15 = 0            'Set LSB bit 15 & 14 to 01 (Code to write to DDS Freq Reg 0)
    FTWLSB1 0.14 = 1
    FTWMSB 0.15 = 0             'Set MSB bit 15 & 14 to 01 (Code to write to DDS Freq Reg 0)
    FTWMSB 0.14 = 1
    DDS_Control_Register 0.11 = 0 ' Tells DDS to use Frequency Register 0
Case 1
    FTWLSB1 0.15 = 1            'Set LSB bit 15 & 14 to 10 (Code to write to DDS Freq Reg 1)
    FTWLSB1 0.14 = 0
    FTWMSB 0.15 = 1             'Set MSB bit 15 & 14 to 10 (Code to write to DDS Freq Reg 1)
    FTWMSB 0.14 = 0
    DDS_Control_Register 0.11 = 1 ' Tells DDS to use Frequency Register 1
EndSelect


Select DDS_Waveform  'Sets the control register code to produce coressponding  waveforms


Case 1 'Sine
    DDS_Control_Register 0.5 = 0: DDS_Control_Register 0.1 = 0
Case 2 'Triangle
    DDS_Control_Register 0.5 = 0: DDS_Control_Register 0.1 = 1
Case 3 'Square
    DDS_Control_Register 0.5 = 1: DDS_Control_Register 0.1 = 0: DDS_Control_Register 0.3 = 1
EndSelect
         
Select DDS_Chip

Case 1 'Programmes DDS 1
         
    DDS_CE1 = 0  'Activate DDS (Set Chip Enable Low)
        SHOut DPin, CPin, 5, [FTWLSB1\16]                   'Set Frequency
        SHOut DPin, CPin, 5, [FTWMSB\16]
        DDS_Control_Register 0.8 = 0                        'Removes reset from DDS chip
        SHOut DPin, CPin, 5, [DDS_Control_Register\16]      'Writes to Control Register removing reset
    DDS_CE1 = 1   'Disable DDS (Set Chip Enable High)

Case 2 'Programmes DDS 2
      
    DDS_CE2 = 0  'Activate DDS (Set Chip Enable Low)
        SHOut DPin, CPin, 5, [FTWLSB1\16]                   'Set Frequency
        SHOut DPin, CPin, 5, [FTWMSB\16]
        DDS_Control_Register 0.8 = 0                        'Removes reset from DDS chip
        SHOut DPin, CPin, 5, [DDS_Control_Register\16]      'Writes to Control Register removing reset
    DDS_CE2 = 1   'Disable DDS (Set Chip Enable High)

EndSelect
GoTo loop
End
Zou ik dat best testen met drukknopjes om te zien als het werkt kan niks zien met een KSO want die is defect.

Wat zou het kunnen zijn als de lichtstip van mijn KSO maar halverwege een terugslag heeft hopelijk niet de afbuigspoelen hoop ik
Plaats reactie