AVR --> ARM

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Всем привет еще раз. Даже не знаю куда отнести возникший вопрос к аппаратным или к программным...

История такая. Потребовался "карманный осцилограф". Нашёл схему со скечем, запустил - работает, но страничный обмен оставляет желать лучшего. Ну, думаю - не проблема: у меня ж еще DUE есть. Переписал с Adafruit-а под UTFT, потому что дисплей под UNO и исходный скетч работают под Adafruit, а DUE и ее дисплей - под UTFT... И всё бы ничего, но компиляция не пошла - упёрлась в какие-то переменные, которые нигде не объявляются в скече, но при компиляции под UNO - нормально и без ошибок.

Как оказалось: это регистры Аналого-Цифрового Преобразователя, с помощью которых работает весь проект. А проще говоря: скеч писан под AVR...

Думаю что в DUE тоже есть AD-преобразователь, но как обратиться к его регистрам - нигде не нашёл или плохо искал. Может кто сталкивался? Вот исходник AS IS:

//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
//дистплей TFT SPFD5408
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define levo 12
#define ok 11
#define pravo 10
#define vertikal 2   //размер вертикальной сеткаи(если "0" отключениа)
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte mass[501];//массив АЦП
byte massDEL[501];
byte menu=1;//переменная верхнего меню
byte razv=0;//значение развертки
float x=60;//счетчик оси Х
int Vmax=0;// максимальное напряжение 
float Vakb=0;//напряженеиЕКБ
unsigned long t=0;//переменная для ращета развертки
unsigned long pause=0;//переменная для замены Delay
int t_del=0; //значение цены деления развертки в микросекундах
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
void setup(){  
    Vakb=analogRead(A6)*5.3/1024;//проверка напряжения на АКБ
    if(opornoe==0){ADMUX = 0b11100101;}//выбор внутреннего опорного 1,1В
    if(opornoe==1){ADMUX = 0b01100101;}//Выбор внешнего опорного
    uint16_t identifier = tft.readID();  
    tft.begin(0x9341);
    delay(50);
    tft.fillScreen(BLACK);
    delay(500);
}
void Zamer(){//заполнение буфера АЦП
  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      t=micros(); 
      for(int i=0;i<500;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(100);
          mass[i]=ADCH;
      }
      t= micros()-t;
      t_del=t*25/501;
  }
  if (razv>0){
      t=micros();
      for(int i=0;i<500;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
      t= micros()-t;
      t_del=t*25/501;
  }
  
}
void MenuT(){//перерисовка нижнего меню    
    tft.setRotation(0);  
    tft.fillRect(0, 20, 20,320, BLACK);//стирание поля меню низ
    //tft.fillRect(0, 15, 25,75, CYAN);//стирание
    //tft.fillRect(0, 170, 25,65, CYAN);//стирание
    tft.setRotation(1);
    tft.setCursor(0,220);
    tft.print("t=");
    if(razv<7){tft.print(t_del);}
    if(razv==7){tft.print(t_del/2);}
    if(razv==8){tft.print(t_del/3);}
    if(razv==9){tft.print(t_del/4);}
    if(razv==10){tft.print(t_del/5);}
    tft.print("us  ");
    tft.print("Vmax=");
    if(opornoe==0){tft.print(Vmax*1.1/255);}
    if(opornoe==1){tft.print(Vmax*5.3/255);}
    tft.print(" ");
    tft.print("B");
    tft.print(Vakb);  
}

void loop() { 
Zamer();  
//отрисовка и перебор меню###############################
if(menu==0){
  tft.setRotation(1);
  tft.setTextColor(RED);
  tft.setTextSize(2); 
  tft.fillRect(0, 0, 85, 25, CYAN);
  tft.setCursor(0,5);
  if(opornoe==0){tft.print("op-1.1V ");}
  if(opornoe==1){tft.print("op-5.3V ");}
  if(digitalRead(pravo)==HIGH){
    tft.setRotation(0); 
    tft.fillRect(65, 0, 120, 50, BLACK);//стирание напряжения
    tft.fillRect(45, 60, 140, 260, BLACK);//стиране поля графика
    opornoe=!opornoe;}
  if(digitalRead(levo)==HIGH){
    tft.setRotation(0);  
    tft.setRotation(0); 
     tft.fillRect(45, 60, 140, 260, BLACK);//стиране поля графика 
    tft.fillRect(65, 0, 120, 50, BLACK);//стирание напряжения
    opornoe=!opornoe;}
  tft.setRotation(1);  
  tft.print("Razv*");
  tft.print(razv);
  tft.print("   PauseOFF");
}
if(menu==1){
  tft.setRotation(1);
  tft.setTextColor(RED);
  tft.setTextSize(2); 
  tft.fillRect(90, 0,120, 25, CYAN);
  tft.setCursor(0,5);
  if(opornoe==0){tft.print("op-1.1V ");}
  if(opornoe==1){tft.print("op-5.3V ");}
  if(digitalRead(pravo)==HIGH){//доработать скорость
  tft.setRotation(0); 
  tft.fillRect(45, 60, 140, 260, BLACK);//стиране поля графика
  razv++;
  if(razv==11){razv=10;} 
  }
  if(digitalRead(levo)==HIGH){//доработать скорость
  tft.setRotation(0); 
  tft.fillRect(45, 60, 140, 260, BLACK);//стиране поля графика
  razv--;
  if(razv==255){razv=0;} 
  }
  tft.setRotation(1); 
  tft.print("Razv*");
  tft.print(razv);
  tft.print("   PauseOFF");
}
if(menu==2){//пауза
  paus=1;
  if(clen_p==0){
  clen_p=1;  
  tft.setRotation(1);
  tft.setTextColor(RED);
  tft.setTextSize(2); 
  tft.fillRect(210, 0,100, 25, CYAN);
  tft.setCursor(0,5);
  if(opornoe==0){tft.print("op-1.1V ");}
  if(opornoe==1){tft.print("op-5.3V ");}
  tft.print("Razv*");
  tft.print(razv);
  if(paus==0){tft.print("   PauseOFF");}
  if(paus==1){tft.print("   PauseON");}
}
}
if(digitalRead(ok)==HIGH){
  menu++;
  tft.setRotation(0); 
  tft.fillRect(45, 60, 140, 260, BLACK);//стиране поля графика  
  if(menu==3){menu=0;paus=0;clen_p=0;}
  tft.setRotation(1); 
  tft.fillRect(0, 0,320, 25, BLACK);    
}
//отрисовка и перебор меню###############################
//Выбор опорного#########################################  
if(opornoe==0){ADMUX = 0b11100101;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100101;}//Выбор внешнего опорного
delay(5);
//Выбор опорного#########################################  
tft.setRotation(0); 
//ось напряжения##########################################
tft.drawFastHLine(44,60,140,BLUE);tft.drawFastHLine(44,59,140,BLUE);tft.drawFastHLine(44,58,140,BLUE);
tft.drawFastVLine(50,50,10, BLUE);tft.drawFastVLine(76,50,10, BLUE);tft.drawFastVLine(102,50,10, BLUE);
tft.drawFastVLine(128,50,10, BLUE);tft.drawFastVLine(154,50,10, BLUE);tft.drawFastVLine(175,50,10, BLUE);
//ось времени#############################################
tft.drawFastVLine(44,60,270, RED);tft.drawFastVLine(43,60,270, RED);tft.drawFastVLine(42,60,270, RED);
tft.drawFastHLine(35,60,10,RED);tft.drawFastHLine(35,85,10,RED);tft.drawFastHLine(35,110,10,RED);tft.drawFastHLine(35,135,10,RED);
tft.drawFastHLine(35,160,10,RED);tft.drawFastHLine(35,185,10,RED);tft.drawFastHLine(35,210,10,RED);tft.drawFastHLine(35,235,10,RED);
tft.drawFastHLine(35,260,10,RED);tft.drawFastHLine(35,285,10,RED);tft.drawFastHLine(35,310,10,RED);
//ось времени#############################################
//сетка вертикальная #####################################

tft.drawFastHLine(75,310,5*vertikal,YELLOW);tft.drawFastHLine(110,310,5*vertikal,YELLOW);tft.drawFastHLine(145,310,5*vertikal,YELLOW);tft.drawFastHLine(180,310,5*vertikal,YELLOW);
tft.drawFastHLine(75,285,5*vertikal,YELLOW);tft.drawFastHLine(110,285,5*vertikal,YELLOW);tft.drawFastHLine(145,285,5*vertikal,YELLOW);tft.drawFastHLine(180,285,5*vertikal,YELLOW);
tft.drawFastHLine(75,260,5*vertikal,YELLOW);tft.drawFastHLine(110,260,5*vertikal,YELLOW);tft.drawFastHLine(145,260,5*vertikal,YELLOW);tft.drawFastHLine(180,260,5*vertikal,YELLOW);
tft.drawFastHLine(75,235,5*vertikal,YELLOW);tft.drawFastHLine(110,235,5*vertikal,YELLOW);tft.drawFastHLine(145,235,5*vertikal,YELLOW);tft.drawFastHLine(180,235,5*vertikal,YELLOW);
tft.drawFastHLine(75,210,5*vertikal,YELLOW);tft.drawFastHLine(110,210,5*vertikal,YELLOW);tft.drawFastHLine(145,210,5*vertikal,YELLOW);tft.drawFastHLine(180,210,5*vertikal,YELLOW);
tft.drawFastHLine(75,185,5*vertikal,YELLOW);tft.drawFastHLine(110,185,5*vertikal,YELLOW);tft.drawFastHLine(145,185,5*vertikal,YELLOW);tft.drawFastHLine(180,185,5*vertikal,YELLOW);
tft.drawFastHLine(75,160,5*vertikal,YELLOW);tft.drawFastHLine(110,160,5*vertikal,YELLOW);tft.drawFastHLine(145,160,5*vertikal,YELLOW);tft.drawFastHLine(180,160,5*vertikal,YELLOW);
tft.drawFastHLine(75,135,5*vertikal,YELLOW);tft.drawFastHLine(110,135,5*vertikal,YELLOW);tft.drawFastHLine(145,135,5*vertikal,YELLOW);tft.drawFastHLine(180,135,5*vertikal,YELLOW);
tft.drawFastHLine(75,110,5*vertikal,YELLOW);tft.drawFastHLine(110,110,5*vertikal,YELLOW);tft.drawFastHLine(145,110,5*vertikal,YELLOW);tft.drawFastHLine(180,110,5*vertikal,YELLOW);
tft.drawFastHLine(75,85,5*vertikal,YELLOW);tft.drawFastHLine(110,85,5*vertikal,YELLOW);tft.drawFastHLine(145,85,5*vertikal,YELLOW);tft.drawFastHLine(180,85,5*vertikal,YELLOW);

//сетка вертикальная #####################################
tft.setRotation(1);  
tft.setTextColor(RED);
tft.setTextSize(2);
//шкала напряжения########################################
if(opornoe==0){
    tft.setCursor(30, 190);tft.println("0"); 
    tft.setCursor(0, 155);tft.println("0.22"); 
    tft.setCursor(0, 130);tft.println("0.44"); 
    tft.setCursor(0,105);tft.println("0.66"); 
    tft.setCursor(0, 80);tft.println("0.88"); 
    tft.setCursor(0, 55);tft.println("1.1V");   
}
if(opornoe==1){
    tft.setCursor(30, 190);tft.println("0"); 
    tft.setCursor(0, 155);tft.println("1.00"); 
    tft.setCursor(0, 130);tft.println("2.00"); 
    tft.setCursor(0,105);tft.println("3.00"); 
    tft.setCursor(0, 80);tft.println("4.00"); 
    tft.setCursor(0, 55);tft.println("5.0V");   
}
//шкала напряжения########################################
if(paus==0){MenuT();}
//максимальное значение сигнала##########################
Vmax=0; 
for(int i=0;i<500;i++){  
        if(Vmax<mass[i]){ Vmax=mass[i];} 
}
//максимальное значение сигнала##########################
//отрисовка графика№№№№№№№№№№№№№№№№№№№№№
if(paus==0){
  tft.setRotation(0); 
  //tft.fillRect(45, 60, 140, 260, BLACK);//стиране графика
  x=60;
  for(int y=0;y<260;y++){
      tft.setRotation(1); 
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;} 
      if(razv==9){x=x+4;}
      if(razv==10){x=x+5;}
      tft.drawLine(x+1,190-massDEL[y]/2+1, x+2,190-massDEL[y+1]/2+1, BLACK);//стираем график
      tft.drawLine(x,190-massDEL[y]/2, x+1,190-massDEL[y+1]/2, BLACK);//стираем график
      tft.drawLine(x+1,190-mass[y]/2+1, x+2,190-mass[y+1]/2+1, GREEN);//график
      tft.drawLine(x,190-mass[y]/2, x+1,190-mass[y+1]/2, GREEN);//график
         
  }
  for(int i=0;i<500;i++){massDEL[i]=mass[i];}
}
if(paus==1){//режим паузы
    //tft.setRotation(0); 
    //tft.fillRect(45, 60, 140, 260, BLACK);//стиране графика 
    if(digitalRead(pravo)==HIGH){//листаем
        tft.setRotation(0); 
        tft.fillRect(45, 60, 140, 260, BLACK);//стиране графика 
      x=60;
      for(int y=0;y<260;y++){
          tft.setRotation(1);
          if(razv<7){x++;}
          if(razv==7){x=x+2;}
          if(razv==8){x=x+3;}
          if(razv==9){x=x+4;}
          if(razv==10){x=x+5;}
      tft.drawLine(x+1,190-mass[y]/2+1, x+2,190-mass[y+1]/2+1, GREEN);//график
      tft.drawLine(x,190-mass[y]/2, x+1,190-mass[y+1]/2, GREEN);//график
      }
      MenuT();
    }
    if(digitalRead(levo)==HIGH){//листаем
      tft.setRotation(0); 
      tft.fillRect(45, 60, 140, 260, BLACK);//стиране графика 
      x=60;
      for(int y=0;y<260;y++){
          tft.setRotation(1); 
          if(razv<7){x++;}
          if(razv==7){x=x+2;}
          if(razv==8){x=x+3;} 
          if(razv==9){x=x+4;}
          if(razv==10){x=x+5;}
      tft.drawLine(x+1,190-mass[y]/2+1, x+2,190-mass[y+1]/2+1, GREEN);//график
      tft.drawLine(x,190-mass[y]/2, x+1,190-mass[y+1]/2, GREEN);//график
      }
      MenuT();
    }     
}
//отрисовка графика№№№№№№№№№№№№№№№№№№№№№
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Цитата:

Думаю что в DUE тоже есть AD-преобразователь, но как обратиться к его регистрам - нигде не нашёл или плохо искал. 

DUE - это название платы ардуино. У платы не может быть никаких регистров. Регистры есть у микроконтроллера, который стоит на этой плате, и называется он Atmel SAM3X8E. Вот по нему информацию и надо искать.

Даташит:  43. Analog-to-Digital Converter (ADC) . . . . . 1317    (аж 37 страниц описания, включая регистры)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Jeka_M пишет:
DUE - это название платы ардуино. У платы не может быть никаких регистров. Регистры есть у микроконтроллера, который стоит на этой плате, и называется он Atmel SAM3X8E. Вот по нему информацию и надо искать...

Ну я ж говорю что плохо искал. Только пока что не хватает таланта привести в соответствие регистры AVR используемые в скече, с регистрами своего кортекса. Блин. Как печально быть тупым (((((

Ладно... Пока что поковыряюсь с остальными моментами перевода на UTFT и DUE и заодно - постараюсь понять что вообще там происходит с этими регистрами и зачем они так нужны именно в этом способе реализации осцилографа.

Там еще надо разобраться с кнопками и с пином для измерения, а то пока что на экране какой-то берд творится.