Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

mikro C Atmel Pascal

Başlatan ipek, 09 Aralık 2016, 22:43:17

ipek

bu kodu bana hex ve eep'e çevirecek arkadaşlar varmı ?

Attenuator.mpas           mikroPascal PRO for AVR by mikroElektronika


      Attenuator.mpas   03.12.2014 17:09:01 

program Attenuator; 
 { 
 Steuerung des Weinschel Attenuators 3200-1 von 0dB bis 127dB. 
 
 Autor:                    Hans-Peter Prast, DL2KHP 
 Datum:                    15.10.2014 
 Prozessor:                ATMega16 
 Clock:                    8 MHz, intern 
 Version:                  1.0 
 Letzte Änderung:          15.10.2014     Programmdatei angelegt angepasst 
                           18.10.2014     Programmcode erstellt 
                           19.10.2014     Programmcode fertiggestellt 
                           05.11.2014     Debugging Programmcode 
                           08.11.2014     Debugging Programmcode 
                           10.11.2014     Handling für "Offset" geändert 
 Attenuator.mpas           mikroPascal PRO for AVR by mikroElektronika 
 
 ---------------------------------------------------------------------- 
 Der Dämpfungswerte des Weinschel Attenuators 3200-1 werden durch die 
 Kombination von 8 Einzelwerten in 1dB-Stufen zwischen 0 und 127dB 
 eingestellt. Das Kombinationsmuster der einzelnen Stufen ist für jedes 
 einzelne dB in einer Tabelle im EEPROM abgelegt. Das EEPROM wird dann mit 
 dem dB-Wert als Adresse ausgelesen und der Inhalt des Speicherplatzes an den 
 Attenuator ausgegeben. 
 Wenn die Taste des Drehgebers gedückt wird, wird der eingestellte Wert als 
 Offset übernommen. Die Anzeige zeigt dann anstelle von "Att = xx dB" 
 "Out = xx dBm" an, der Anzeigewert wird "0" und der eingestellte Wert wird 
 jetzt als Offset angezeigt. Jetzt kann auch ein Wert größer "0", bis zum 
 eingestellten Offset, angezeigt werden. Das ist als Hilfe gedacht, wenn Geräte 
 z.B. bis 20dBm kalibriert werden sollen. Dann kann ein Wert von 20 dBm angelegt 
 werden. Wird dann bei einer Einstellung "Att = -20dB" die Taste am Drehgeber 
 betätigt, wird der Wert übernommen und "Out = 0 dBm" angezeigt. Der Anzeige 
 entspricht jetzt dem tatsächlichen Ausgangswert. Jetzt kann dann auch bis zum 
 eingestellten Offset, über "0" hinaus, bis 20 dBm eine Einstellung vorgenommen 
 werden. Ein erneuter Druck auf den Drehgeber schaltet den Offset wieder ab. 
 
 Wenn beim Einschalten die Taste Down1x festfehalten wird, kann die Helligkeit 
 des Displays mit den Tasten Up10x und Down10x eingestellt werden. Ein Druck auf 
 die Taste Up1x beendet die Einstellung. Der Helligkeitswert wird abgespeichert 
 und beim Einschalten wieder eingestellt. 
 
 
 Belegung EEPROM 
 0x000 - 0x07F      Schaltmuster für die Dämpfungswerte 
 0x1F0              PWM-Wert für die Hintergrundbeleuchtung 
 0x1F1 - 0x1FF      frei 
 
 } 
 
 // Vereinbarungsteil ------------------------------------------------- 
 const 
 // LCD Parameter ----------------------------------------------------- 
     k_zeile1 = ' * Attenuator * '; // Startmeldung 
     k_zeile2 = ' * Vers.: 1.0 * '; // dito 
     b_rs = 6;                             // RS-Bit im Steuerport B 
     b_en = 7;                             // EN-Bit im Steuerport B 
 // Ports ------------------------------------------------------------- 
     k_ddr_a = 0xff;                       // Display-Daten, alles Output 
     k_ddr_b = %11000000;                  // B0 - B5 Eingang, B6 = RS, B7 = EN 
     k_port_b = %00111111;                 // Pull-Up-Widerst. Port B 
     k_ddr_d = %10000000;                  // PD0 = B. PD2 = A, PD3 =       PD7 = PWM Displ. 
     k_port_d = %01111010;                 // Pull-Up-Widerstände Port D 
     k_ddr_c = 0xff;                      // Port C Ansteuerung Dämpfungsglied 
 // Taster, Digital-Bits ---------------------------------------------- 
     b_sw1 = 0;                           // Eingang Taster SW1, up 1x            port B 
     b_sw2 = 1;                           // Eingang Taster SW2, down 1x          port B 
     b_sw3 = 2;                           // Eingang Taster SW3, up 10x           port B 
     b_sw4 = 3;                            // Eingang Taster SW4, down 10x         port B 
     b_pwm = 7;                           // PWM Ausgang LCD-Beleuchtung          port D 
     b_inc_a = 2;                         // Drehgeber Ausgang A         port D 
     b_inc_b = 0;                         // Drehgeber Ausgang B         port D 
     b_push = 3;                          // Drehgeber Taster            port D 
 // Timer 2, PWM Steuerung -------------------------------------------- 
     k_tccr2 = %01101100;                 // Fast PWM, OC-Output, 1:64 
     k_pwm = 200;                         // Vorgabe PWM-Steuerung Hell 
     k_eep_pwm = 0x1f0;                   // Adresse EEPROM Speicherplatz PWM-Wert 
 // User Flag Register ------------------------------------------------ 
     b_db_neu = 1;                        // dBm-Wert wurde geändert 
     b_anz_neu = 2;                       // LCD-Anzeige aktualisieren 
     b_taste_up1 = 3;                     // Taste Up 1x wurde betätigt 
     b_taste_down1 = 4;                   // Taste Down 1x wurde betätigt 
     b_taste_up2 = 5;                     // Taste Up 10x wurde betätigt 
     b_taste_down2 = 6 ;                  // Taste Down 10x wurde betätigt 
     b_taste_push = 7;                    // Taster Drehgeber 
     b_offset = 8;                        // Offset aktiv 
 
 // Variablen ---------------------------------------------------------- 
 var 
     v_stat_int1,                         // für Statusabfrage im Interrupt 1 
     v_stat_ovint,                        // für Statusabfrage im Overflow-Interrupt 
     v_stat_net : boolean;                // für Statusabfrage in der Steuerung 
 
     v_pwm,                               // PWM-Wert für die Hintergrundbeleuchtung 
     v_pwm_zwi,                           // Zwischenspeicher für PWM-Wert 
     v_db,                                // Enthält den Wert der geschalteten dB 
     v_db_off,                            // Enthält den Offset für die Anzeige 
     v_sw,                                // Enthält den Schalterzustand 
     v_temp     : byte;                   // Global 
 
     v_db_anz : integer;                  // Variable für den Anzeigewert 
 
     v_ufr      : array [1..10] of boolean; // User Flag Register 
     v_displ    : array [1..23] of char; // 1. Vorz., 2. Zehner, 3. Einer, Komma 
     v_zeile : string[16]; 
 
 // LCD-Variablen für die Library ------------------------------------- 
 var LCD_RS : sbit at PORTB6_bit; 
 var LCD_EN : sbit at PORTB7_bit; 
 var LCD_D4 : sbit at PORTA4_bit; 
 var LCD_D5 : sbit at PORTA5_bit; 
 var LCD_D6 : sbit at PORTA6_bit; 
 var LCD_D7 : sbit at PORTA7_bit; 
 var LCD_RS_Direction : sbit at DDB6_bit; 
 var LCD_EN_Direction : sbit at DDB7_bit; 
 var LCD_D4_Direction : sbit at DDA4_bit; 
 var LCD_D5_Direction : sbit at DDA5_bit; 
 var LCD_D6_Direction : sbit at DDA6_bit; 
 var LCD_D7_Direction : sbit at DDA7_bit; 
 
 
 // Ende Vereinbarungsteil ------------------------------------------ 
 
 
 // Interrupt Service Routinen -------------------------------------- 
 
 // Drehgeber betätigt ---------------------------------------------- 
 procedure int0int(); org 0x002;  // Drehgeber wurde betätigt 
 begin 
 
    if (pind.b_inc_a = pind.b_inc_b) then 
         begin 
            if v_db <= 126 then 
              begin 
                v_db := v_db + 1;                // Wert für die Dämpfung incrementieren 
              end; 
         end; 
      if (pind.b_inc_a <> pind.b_inc_b) then 
          begin 
             if v_db > 0  then 
               begin 
                  v_db := v_db - 1;               // Wert für die Dämpfung decrementieren 
               end; 
          end; 
      v_ufr[b_db_neu]:= 1; 
 end; 
 
 
 // Taster Drehgeber betätigt ------------------------------------ 
 // Bei jeder Betätigung wird das Tasten Flag geändert 
 procedure int1int(); org 0x004;  // Taster Drehgeber wurde betätigt 
 begin 
      if v_stat_int1 = 0 then 
        begin 
          v_ufr[b_taste_push] := 1;  // Taster Flag setzen 
          v_stat_int1 := 1; 
        end 
        else 
          begin 
             v_ufr[b_taste_push] := 0;  // Taster Flag wieder löschen 
             v_stat_int1 := 0; 
          end; 
       v_ufr[b_db_neu]:= 1; 
 end; 
 
 // PWM Steuerung der LCD Hintergrundbeleuchtung ------------------ 
 // Timer-Overflow Interrupt mit Abfrage der Up-Down-Tasten 
 procedure ovf2int(); org 0x008; // Timer 2 Overflow Interrupt 
 var 
    v_zwi : byte; 
 begin 
    ocr2 := v_pwm;             // Output Compare Register mit PWM-Wert neu laden 
 // Tasten im Timerinterrupt abfragen -------------------------- 
    v_zwi := 0; 
    v_zwi := PINB;                       // Tastereingänge aus Port B laden 
    v_zwi := not v_zwi;                  // und invertieren (Low aktiv) 
    v_zwi := (v_zwi and 0x0f);           // Taster maskieren (Bit 0 bis 3) 
    if (v_stat_ovint = 0) and (v_zwi > 0) then 
       begin                             // Nur einmal ausführen solange Taster aktiv 
         v_sw := v_zwi;                  // Tasterbits in Variable übernehmen 
         v_stat_ovint := 1;              // Statusbit aktiv setzen 
         v_ufr[b_db_neu] := 1;           // Berechnung neustarten 
       end; 
    if (v_zwi = 0) then v_stat_ovint := 0; // Statusbit inaktiv setzen 
                                                    // wenn kein Taster mehr betätigt ist 
 end;

 // Messwerte vom 10 Bit Analog/Digitalwandler lesen --------------------- 
 procedure adcint(); org 0x01C; 
 begin 
                                       // wird momentan nicht benötigt 
 end; 
 
 procedure twiint(); org 0x0022; 
 begin 
                                       // wird momentan nicht benötigt 
 end; 
 // Ende der Interruptservice-Routinen --------------------------------- 
 
 // Unterprogramme ----------------------------------------------------- 
 procedure p_init;                        // Prozessor initialisieren 
 Var i : byte; 
 Begin 
     DDRA := k_ddr_a;                     // Port A Display, alles Output 
     DDRB := k_ddr_b;                     // Disp. PB7=RS, PB6=E, PB0-PB4 = Sw1 - Sw4 
     PORTB := k_port_b;                   // Pullup-Widerstände für Sw1 - Sw4 ein 
     DDRC := k_ddr_c;                     // Ansteuerung Attenuator, alles Output 
     DDRD := k_ddr_d;                     // Datenrichtung Taster + PWM Port 
     PORTD := k_port_d;                   // Pull-Up-Widerstände Port D, 7 PWM-Port 
     portd.b7 := 1;                       // Hintergrundbeleuchtung ein 
 // LCD-Anzeige initialisieren ----------------------------------------- 
     Lcd_Init();                          // Display initialisieren 
      lcd_cmd(_lcd_cursor_off);           // und Cursor ausschalten 
     v_zeile :=  k_zeile1; 
      lcd_out(1,1,v_zeile);               // Startmeldung ausgeben 
     v_zeile :=  k_zeile2; 
      lcd_out(2,1,v_zeile); 
 // Werte aus EEPROM laden --------------------------------------------- 
     v_pwm := EEPROM_Read(k_eep_pwm);          // PWM-Wert aus EEPROM laden 
 // PWM Steuerung initialisieren ---------------------------------------- 
     ocr2 := v_pwm;                            // Output Compare Register vorbesetzen 
     tccr2 := k_tccr2;                         // Timer 2 initialisieren 
     timsk.toie2 := 1;                         // Timer 2, Overflow Interrupt ein 
 // Globale Variablen initialisieren ------------------------------- 
     v_db := 0;                                // db-Wert löschen 
     v_db_off := 0;                            // Offset löschen 
     v_sw := 0;                                // Schalter löschen 
 // Die Statusbits müssen global vereinbart werden, da lokale Variablen 
 // bei jedem Prozedur Aufruf gelöscht werden! 
     v_stat_net := 0;                          // Status in der Steuerung 
     v_stat_int1 := 0;                         // Status im Interrupt 1 
     v_stat_ovint := 0;                        // Status im Overflow-Interrupt 
 // User Flag-Register für die Programmsteuerung 
     for i := 1 to 10 do v_ufr[i] := 0; // User-Flag Register löschen 
     v_ufr[b_db_neu] := 1;                     // Berechnung neustarten 
     v_ufr[b_anz_neu]:= 1;                     // Anzeige aktivieren 
 
      SREG_I_bit := 1;                         // Global Interrupt enable 
 end; 
 
 // Hintergrundbeleuchtung einstellen ------------------------------- 
 // Wird ausgeführt, wenn beim Einschalten die Down1x-Taste gedrückt wird. 
 procedure p_pwm; 
 begin 
    v_zeile := '     Beleuchtung     '; 
    lcd_out(1,1,v_zeile); 
    v_zeile := '     einstellen      '; 
    lcd_out(2,1,v_zeile); 
    while pinb.b_sw2 = 0 do;             // Warten bis Down1x-Taste losgelassen wird 
    repeat 
       if ((pinb.b_sw3 = 0) and (pinb.b_sw4 = 1)) then 
         if (v_pwm < 0xff) then           // prüfen ob Maxwert erreicht 
             v_pwm := v_pwm + 1;          // Wenn nein, v_pwm incrementieren 
       if ((pinb.b_sw4 = 0) and (pinb.b_sw3 = 1)) then 
         if (v_pwm > 3) then              // prüfen ob Minwert erreicht 
             v_pwm := v_pwm - 1;          // Wenn nein, v_pwm decrementieren 
      delay_ms(10);                       // Verzögerung für Tastenbedienung 
      until (pinb.b_sw1 = 0);             // Einstellung mit Up1x beenden 
      v_zeile := '     Beleuchtung     '; 
      lcd_out(1,1,v_zeile); 
      v_zeile := '     eingestellt     '; 
      lcd_out(2,1,v_zeile); 
      EEPROM_write(k_eep_pwm, v_pwm); // PWM-Wert im EEPROM ablegen 
      delay_ms(500);                        // Verzögerung für Anzeige 
      v_ufr[b_taste_up1] := 0;              // Tasten-Flag wieder löschen 
      v_ufr[b_taste_down1] := 0;            // Tasten-Flag wieder löschen 
 end; 
 
 // Startprozedur, wird nur einmalig beim Einschalten durchgeführt ----------- 
 procedure p_start;                 // Gerät initialisieren 
 begin 
 // 1 s Verzögerung für Startbildschirm 
    delay_ms(1000); 
    if (pinb.b_sw2 = 0) then p_pwm; // Falls Down1x gedückt, Beleuchtung anpassen 
    repeat until (pinb.b_sw1 = 1);          // Warten bis Up1x-Taste losgelassen wird 
 //Tasteninterrupts einschalten --------------------------------------------- 
    mcucr.isc10 := 0; 
    mcucr.isc11 := 1;                // Interrupt 1 bei Low-Flanke Taste Drehgeber INT1 
    mcucr.isc00 := 0; 
    mcucr.isc01 := 1;                // Interrupt 0 bei Low-Flanke Drehgeber "A"            INT0 
    gicr.int0 := 1;                  // Interrupt 0 Taste Drehgeber "A" einschalten 
    gicr.int1 := 1;                  // Interrupt 1 Taste Drehgeber einschalten 
    v_sw := 0;                       // Tasten-Variable löschen 
    v_db := 0; 
    v_ufr[b_anz_neu] := 1;           // Flag für LCD-Anzeige setzen 
 end; 

 // Schalter auswerten -------------------------------------------------- 
 // Hier wird das untere Nibble der Schaltervariable ausgewertet. Momentan 
 // werden nur die Einzelbetätigungen der Schalter ausgewertet. Mögliche 
 // Doppelbetätigungen können bei Bedarf noch eingefügt werden. 
 procedure p_switch; 
 begin 
    if v_sw > 0 then 
       begin                   // Je nach gedrückter Tastenkombination wird 
         case v_sw of          // die entsprechende Anweisung ausgeführt 
            1: begin           // Taste Down1x betätigt 
                  if v_db > 0 then v_db := v_db - 1; 
 //                 if v_db <= 126 then v_db := v_db + 1; 
               end; 
            2: begin           // Taste Up1x betätigt 
                  if v_db <= 126 then v_db := v_db + 1; 
 //                if v_db > 0 then v_db := v_db - 1; 
               end; 
            3: begin    end;  // Taste Down1x und Up1x         betätigt 
            4: begin           // Taste Down10x betätigt 
                  if v_db > 9 then v_db := v_db - 10; 
 //                 if v_db <= 117 then v_db := v_db + 10; 
               end; 
             5: begin    end; // Taste Up1x und Up10x        betätigt 
             6: begin    end; // Taste Down1x und Up10x         betätigt 
             7: begin   end; // Taste Down1x, Up1x und Up10x betätigt 
             8: begin         // Taste Down1x betätigt 
                 if v_db <= 117 then v_db := v_db + 10; 
 //                 if v_db > 9 then v_db := v_db - 10; 
                end; 
             9: begin   end; // Taste Down10x und Down1x         betätigt 
           10: begin    end; // Taste Down10x und Up1x         betätigt 
           11: begin    end; // Taste Down10x, Up1x und Down1x betätigt 
           12: begin    end; // Taste Down10x und Up10x         betätigt 
           13: begin    end; // Taste Down10x, Up10x und Up1x betätigt 
           14: begin    end; // Taste Down10x, Up10x und Down1x betätigt 
           15: begin    end; // Taste Down10x, Up10x, Down1x und Up1x betätigt 
         end; 
         v_sw := 0; 
         v_ufr[b_db_neu] := 1; 
       end; 
 end; 
 
 // Bildung des Dämpfungswertes und Anzeigewert generieren ------- 
 procedure p_db; 
 var 
     v_ausgabe : byte; 
     ee_adress: word; 
 begin 
 // Prüfen ob ein neuer dB-Wert vorliegt -------------------------- 
    If v_ufr[b_db_neu] = 1 then              // berechnen wenn neuer dB-Wert vorliegt 
        begin 
          v_db_anz := v_db;                  // dB-Wert in Anzeigevariable übernehmen 
 // Offset prüfen ------------------------------------------------- 
          if (v_ufr[b_taste_push] = 1) and (v_ufr[b_offset] = 0) then 
            begin 
               v_db_off := v_db;             // aktueller dB-Wert als Offset übernehmen 
               v_ufr[b_offset] := 1;         // Offset-Flag setzen 
             end; 
          if (v_ufr[b_taste_push] = 0) and (v_ufr[b_offset] = 1) then 
            begin 
               v_db_off := 0;                // Offset und Flag wieder löschen 
               v_ufr[b_offset] := 0; 
             end; 
 // Anzeigewert bilden ---------------------------------------------- 
          v_db_anz := (v_db_anz - v_db_off); 
 // Vorzeichen setzen 
          if (v_db_anz + v_db_off) >= 0 then v_db_anz := (v_db_anz * -1); 
 // Schaltwert aus EEPROM laden und an Attenuator ausgeben ---------- 
          ee_adress := v_db;                 // dB-Wert als Tabellenadresse laden 
          v_ausgabe := EEPROM_READ(ee_adress); // Schaltmuster aus Tabelle laden 
          PORTC := v_ausgabe;                // Attenuator schalten 
          v_ufr[b_db_neu] := 0;              // Flag wieder löschen 
          v_ufr[b_anz_neu] := 1;             // Flag für LCD-Anzeige setzen 
        end; 
 end; 
 
 // Bildschirmausgabe ----------------------------------------------- 
 procedure p_lcd; 
 Var 
    v_text : array[3] of char;          // Variable für die Ausgabewerte als Text 
 begin 
 if (v_ufr[b_anz_neu] = 1) Then 
    begin                             // Nur ausführen wenn neuer dB-Wert vorliegt 
       ShortToStr(v_db_anz, v_text); 
           begin 
              if (v_ufr[b_offset] = 1) then 
                begin 
                   v_zeile := 'Out =              dBm';  // wenn Offset geschaltet 
                   lcd_out(1,1,v_zeile); 
                end 
                else 
                begin 
                   v_zeile := 'Att =              dB ';  // Wenn kein Offset 
                   lcd_out(1,1,v_zeile); 
                end; 
              lcd_out(1,8,v_text);                        // dB-Wert anzeigen 
              v_zeile := 'Offset =           dB ';        // Offsetzeile eintragen 
              lcd_out(2,1,v_zeile); 
              ByteToStr(v_db_off, v_text); 
              lcd_out(2,9,v_text);                        // Offset-Wert anzeigen 
       end; 
       delay_ms(100);                     // Verzögerung für Anzeigestabilität 
    end; 
    v_ufr[b_anz_neu] := 0; 
 end; 
 
 // Ende Unterprogramme -------------------------------------------------- 
 
 // ---------------------------------------------------------------------- 
 {Hauptprogramm} 
 // ---------------------------------------------------------------------- 
 begin 
    p_init;                                // System initialisieren 
    p_start;                               // Startprozedur, 
    while true do                          // Endlosschleife Hauptprogramm 
     begin 
        p_switch;                          // Schalter einlesen 
        p_db;                              // dB-Wert bilden 
        p_lcd;                             // und auf Display ausgeben 
      end; 
 end.

gmngz

Başındaki rakamlar olmadan yüklersen derlerimde. Onları silmek zor geliyor :)

gmngz

#2
8mhz dahili osilatör
atmega16
dosyalar linkte
https://yadi.sk/d/yVt9RTmr32vMpM

ipek

@gmngz öncelikle ilgin ve alakan için çok teşekkür ederim,pascal'dan hiç anlamıyorum.

devreyi simule ettim encoder ve buttonlar kusursuz çalışt,fakat attenuator'a hükmedecek PortC tuşlara göre değer almıyor,initialize olur iken port değişiyor bir dahada değişmiyor,atladığım birşeymi var yada Proteus'un azizliğimi bir kontrol etmeni rica edeceğim...
yazarın orijinal makalesi.....http://www.dl2khp.de/projekte/attenuator.html

buda simulasyon dosyası...http://s2.dosya.tc/server3/ing850/Attenuator.rar.html

iyi geceler dilerim...

ipek

#4
enteresan birde display'da dB ve dBm karakterleri yok,matah almancam ile okumaya çalıştım problem sanırım eeprom kısmı ile ilgili..zira x1 butonlarının birine basarak devreyi çalıştırırsam pwm dimmer kısmına giriyor ve çıkarken değeri eeproma kaydediyor,fakat yeniden çalıştırdığımda ise dimmer fonksiyonu yokmuş gibi davranarak full aydınlıktan açılıyor,hadi bakalım hayırlısı yazar e-maile cevap vermediği için sadece yorum yapabiliyorum..


yazar pascal dosyasını pdf dosyasına yazmış,bende sayfa sayfa text çıkarmıştım,374 'ncü satır ve biraz altındaki 2x16 için verilmiş satırların arası açılmış text editörün hatası yani olması gerekeken '    maximum 16 karakter ' olmalıydı acaba editör başka yerleridemi bozdu... ?

OG

Hocam bu basit bir iş, siz rahatlıkla yapabilirsiniz.
MCU seciminiz PIC olursa burada, forumda yardımcı oluruz ve beraber yaparız.
Bir zorluk yok bu çalışmada.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

gmngz

Almancam yok ama anladığım kadarı ile eeprom tablosunu okumaya çalışıyor. girilen değerlere görede okuyacağı adresi değiştiriyor
http://www.dl2khp.de/media/files/Tabelle_EEPROM.pdf

ipek

#7
bahsettiğiniz pdf'i okudum sanki offet kayması gibi hiçbirşey anlamadım,kısaca öz olarak 0 dan 127 rakamına kadar portC'de binary olarak gezinmesi lazım,yahu ne kadar zormuş.pic basicte yazdım simulasyonda sorunsuz çalışıyor,gerçek devrede encoder 5'er 10'ar kafasına göre çalışıyor,değeri kaydetmiyor aynı att'den bende var ona can vereyim dedim,adam hazır yapmış çalışan problemsiz bir devre diye üzerine düştüm ama bişey çıkmayacak galiba..

buda ETE hocam ile birlikte yaptığımız gerçek devrede 10 adet değişik encoder ile denedim maalesef bounce yapıyor tüm önlemleri almama rağmen,pic basic pro ile kesme kontrolü yapılmadan encoder rutininin çalışmayacağını gayet iyi anlamış bulunmaktayım,bende kesmeden anlamıyorum...
http://s2.dosya.tc/server3/gzpc3g/16F873A__Attenuator_v2_E2_Bar.rar.html

ipek

micro pascal' ücretsiz sürümünü indirdim,proje dosyasını çağırıp ilgili LCD düzeltmelerini yaptım sadece uyarı olarak ilgili satırdaki 3 rakamını beğenmiyordu onuda 4 yaptım olumsuz mesaj vermedi ama hala portC 'de değişkenlik yok,birde yeniden derlediğimde Led backlight Pwm değerini artık hafızaya almaya başladı...yani bu kadar düzeltmeden sonra niye çalışmadı anlamadım,eeprom tablosunu yeniden oluştursam nereye yazmam gerekli ?
366:   v_text : array[3] of char;    // Variable für die Ausgabewerte als Text

ipek

bu atmel gıcık bir şeymiş,tabloyu elle editleyerek pascaldaki eeprom editörü kullandım,sonuçta bir hex dosyası oluşturabildim,şaka gibi bu seferde proteus eeprom için hex dosyası değil bin dosyası isterim diyor...
ne yazıkki program aletim Topmax2 universal programmer bunda'da eepromu çağıracak yer yok şunu bir çalıştırayım,bi daaaa ATMEL mi töbeee...

ne demişler atalarımız bildiğin yol en doğru yol,

mehmet

Abi yapmayın ya... İyidir Atmel.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ipek

tam tahmin ettiğim gibiymiş,her şeyi doğru sırada yapmışım,yazar nihayet cevap verdi,eeprom'a shift ve offset tablosu gerekiyormuş,attenuator'u kalibre edebilmek için,
şimdi sizlerden istediğim stand alone yada universal program cihazlarında ana hex'i ve eeprom hex'i ayrı ayrı çağıracak bir fonksiyon yok,sadece main hex yada bin dosyasını dahil edebiliyorsunuz, tek kullanımlık olduğu için en az zararla bu iki dosyayı aynı anda çağırıp programlayabileceğim en ucuz en pratik çözümü önermeniz...


ipek

@engerex evet ideal çözüm gözüküyor,bana yürüme mesafesi 250m'de mevcut ,fakat iki dosyayıda aynı anda ayrı ayrı çağırabiliyormu ?

bocek

Bildiğim kadarıyla aynı anda çağırmaya gerek yok. Sırayla ayrı ayrı yazsanız da eeprom olan eeproma, program olan da flash'taki yerine yazılıyor zaten.
Hatırladığım kadarıyla Avr-gcc'de; programda eeprom tanımlaması varsa, derlediğimizde .hex'in yanında bir de .eep diye bir dosya oluşuyordu ve biz bunları aynı programlayıcı ile (usbasp) ayrı ayrı yazıyorduk iş bitiyordu.
Siz bir de öyle deneyin bence. Ayrı ayrı yazın.
1 ya da 0. işte 'bit'ün mesele..